2013-07-09 6 views
6

Есть ли общий эффективный способ присвоения значений подмножеству DataFrame в пандах? У меня есть сотни строк и столбцов, к которым я могу получить доступ напрямую, но мне не удалось выяснить, как редактировать их значения без повторения через каждую пару строк, col. Например:Редактирование pandas DataFrame с использованием индексов

In [1]: import pandas, numpy 

In [2]: array = numpy.arange(30).reshape(3,10) 

In [3]: df = pandas.DataFrame(array, index=list("ABC")) 

In [4]: df 
Out[4]: 
    0 1 2 3 4 5 6 7 8 9 
A 0 1 2 3 4 5 6 7 8 9 
B 10 11 12 13 14 15 16 17 18 19 
C 20 21 22 23 24 25 26 27 28 29 

In [5]: rows = ['A','C'] 

In [6]: columns = [1,4,7] 

In [7]: df[columns].ix[rows] 
Out[7]: 
    1 4 7 
A 1 4 7 
C 21 24 27 

In [8]: df[columns].ix[rows] = 900 

In [9]: df 
Out[9]: 
    0 1 2 3 4 5 6 7 8 9 
A 0 1 2 3 4 5 6 7 8 9 
B 10 11 12 13 14 15 16 17 18 19 
C 20 21 22 23 24 25 26 27 28 29 

Я считаю, что здесь происходит то, что я получаю копию, а не зрения, это означает, что я не могу назначить оригинальной DataFrame. Это моя проблема? Каков наиболее эффективный способ редактировать эти строки x столбцов (желательно в темпе, поскольку DataFrame может занимать много памяти)?

Кроме того, что, если я хочу заменить эти значения правильно сформированным DataFrame?

ответ

10

Использование loc в выражении присваивания (= означает, что это не имеет значения, является ли это мнение или копия!):

In [11]: df.loc[rows, columns] = 99 

In [12]: df 
Out[12]: 
    0 1 2 3 4 5 6 7 8 9 
A 0 99 2 3 99 5 6 99 8 9 
B 10 11 12 13 14 15 16 17 18 19 
C 20 99 22 23 99 25 26 99 28 29 

Если вы используете версию до 0.11 вы можете использовать .ix ,

Как @Jeff комментарии:

Это выражение присваивания (см 'advanced indexing with ix' section of the docs) и не возвращает ничего (хотя есть назначение выражения, которые сделать возврата вещи, например .at и .iat).

df.loc[rows,columns]can return a view, но обычно это копия. Сбивает с толку, но делается для эффективности.

Итог: использованиеix, loc, ilocустановить(как указано выше) и не изменяют копии.

См. 'view versus copy' раздел документов.

+0

Я получаю ошибку атрибута для df.loc. Я предполагаю, что это ново в пандах 0.11. Раньше был эквивалент, или именно поэтому мне нужно обновлять панды раз в два месяца? – Noah

+0

Кроме того, он описывает где-то в документах, что это представление, а не копия? См. Http://pandas.pydata.org/pandas-docs/dev/indexing.html#indexing-view-versus-copy – Noah

+0

Определенно, что документы требуют больше узнать о том, когда это представление или копия, я сказал, что я добавили бы некоторые документы в прошлом (просто нужно выработать все входы и выходы), сделает проблему github, чтобы получить мяч, катится ... –