使用索引编辑pandas DataFrame

Noa*_*oah 6 python pandas

是否有一种通用,有效的方法将值分配给pandas中的DataFrame子集?我有数百个行和列,我可以直接访问,但我没有设法弄清楚如何编辑他们的值而不迭代每一行,col对.例如:

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
Run Code Online (Sandbox Code Playgroud)

我相信这里发生的事情是我得到的是副本而不是视图,这意味着我无法分配到原始的DataFrame.那是我的问题吗?编辑那些行x列的最有效方法是什么(最好是节奏,因为DataFrame可能占用大量内存)?

另外,如果我想用正确形状的DataFrame替换这些值,该怎么办?

And*_*den 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
Run Code Online (Sandbox Code Playgroud)

如果您使用的是0.11之前的版本,则可以使用.ix.

正如@Jeff评论:

这是一个赋值表达式(见"高级索引与IX"的文档的部分),不返回任何东西(虽然有赋值表达式该回事情,例如.at.iat).

df.loc[rows,columns] 可以返回一个视图,但通常它是一个副本.令人困惑,但效率很高.

底线:使用 ix,loc,iloc 设置 (如上),并且不修改副本.

请参阅文档的"查看与复制"部分.