【问题标题】:Why can't you modify attribute of a row directly in pandas为什么不能直接在熊猫中修改一行的属性
【发布时间】:2020-10-23 11:56:22
【问题描述】:

假设我有一个数据框 A,其属性名为“分数”。 我可以通过以下方式修改第二行的“分数”属性:

tmp = A.loc[2]

tmp.score = some_new_value

A.loc[2] = tmp

但我不能这样做:

A.loc[2].score = some_new_value

为什么?

【问题讨论】:

  • 您收到错误消息还是什么?
  • 听起来像是错字。对我来说它有效。我已经测试过这个df = pd.DataFrame([[1, 2], [1, 3], [4, 6]], columns=['A', 'B']) \n df.loc[2].A = -1
  • @BERA 没有错误,但数据框未使用 some_new_value 更新

标签: python pandas numpy dataframe data-science


【解决方案1】:

很难重现您的情况,因为 Pandas 不保证在使用链式索引时该操作将返回数据帧的 view 还是 copy。 p>

当您通过

访问数据框的“单元格”时
A.loc[2].score

您实际上是在执行两个步骤:首先是.loc,然后是.score(本质上是链式索引)。 Pandas 文档有一篇关于它的好帖子here

防止这种情况发生的最简单方法是始终使用.loc.iloc 来访问您需要的行/列并重新分配值。因此,我建议始终使用任一

A.loc[2, "score"] = some_new_value

A.at[2, "score"] = some_new_value

这种索引 + 设置将“在后台”翻译为:

A.loc.__setitem__((2, 'score'), some_new_value) # modifies A directly

而不是 __getitem____setitem__ 的不可靠链。

【讨论】:

  • 非常感谢您的回答。我尝试了@user2640045 的代码,它确实有效,所以我很困惑为什么同样的事情对我不起作用。
【解决方案2】:

让我们举个例子:

import pandas as pd
dict_ = {'score': [1,2,3,4,5,6], 'other':'a'}
A = pd.DataFrame(dict_)
A

数据框:

    score   other
0   1       a
1   2       a
2   3       a
3   4       a
4   5       a
5   6       a

现在您可以执行以下操作,并且实际保存了值:

A.loc[2,'score'] = 'Heyyyy'
A

数据框:

    score   other
0   1       a
1   2       a
2   Heyyyy  a
3   4       a
4   5       a
5   6       a

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-18
    • 1970-01-01
    • 1970-01-01
    • 2021-05-26
    相关资源
    最近更新 更多