使用索引编辑Pandas数据帧

2024-03-29 13:32:03 发布

您现在位置:Python中文网/ 问答频道 /正文

有没有一种通用的、有效的方法将值赋给pandas中数据帧的子集?我有成百上千的行和列可以直接访问,但我还没有弄清楚如何编辑它们的值,而不必遍历每一行、每一列对。例如:

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

我相信这里发生的是,我得到的是一个副本而不是一个视图,这意味着我无法分配给原始数据帧。这是我的问题吗?编辑这些行x列的最有效方法是什么(最好是在速度上,因为数据帧可能占用大量内存)?

另外,如果我想用形状正确的数据帧替换这些值呢?


Tags: columns数据方法innumpy编辑pandasdf
1条回答
网友
1楼 · 发布于 2024-03-29 13:32:03

在赋值表达式中使用^{}=表示它与视图或副本无关!)以下内容:

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注释:

This is an assignment expression (see 'advanced indexing with ix' section of the docs) and doesn't return anything (although there are assignment expressions which do return things, e.g. .at and .iat).

df.loc[rows,columns]can return a view, but usually it's a copy. Confusing, but done for efficiency.

Bottom line: useix, loc, ilocto set(as above), and don't modify copies.

参见文档的'view versus copy'部分。

相关问题 更多 >