使用索引编辑pandas DataFrame[英] Edit pandas DataFrame using indexes

本文是小编为大家收集整理的关于使用索引编辑pandas DataFrame的处理方法,想解了使用索引编辑pandas DataFrame的问题怎么解决?使用索引编辑pandas DataFrame问题的解决办法?那么可以参考本文帮助大家快速定位并解决问题。

问题描述

有没有一种通用的、有效的方法来为 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 替换这些值怎么办?

推荐答案

使用 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] 可以返回一个视图,但通常它是一个副本.令人困惑,但这样做是为了提高效率.

底线:使用 ix、loc、iloc 设置 (如上)和不要修改副本.

参见 '查看与复制' 文档部分.

本文地址:https://www.itbaoku.cn/post/1727933.html