使用索引编辑Panda DataFrame



是否有一种通用、有效的方法可以将值分配给panda中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替换这些值,该怎么办?

在赋值表达式中使用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评论:

这是一个赋值表达式(请参阅文档的"使用ix进行高级索引"部分),不返回任何内容(尽管有些赋值表达式返回内容,例如.at.iat)。

df.loc[rows,columns]可以返回视图,但通常是副本。令人困惑,但这样做是为了提高效率。

底线:使用ixlociloc设置(如上所述),并且不修改副本

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

最新更新