【问题标题】:Modify dict in dataframe cell修改数据框单元格中的 dict
【发布时间】:2019-02-23 14:53:30
【问题描述】:

我有一个熊猫数据框。在每个单元格中都有一个字典:

id | A                | B              | ...
1  | {"a": 1, "b":1}  |{"d": 1, "e":1} | ...
2  | {"a": 2, "b":3}  |{"d": 5, "e":6} | ...
...
10  | {"a": 1, "b":1}  |{"d": 1, "e":3} | ...

我想更新一个单元格(e.i 1,A):

df.loc[1,"A"].update({"c":2})

此过程会更新具有相同字典的每个单元格,因此在这种情况下会出现(1,A 和 10,A 将被更改):

id | A                       
1  | {"a": 1, "b":1, "c":2}  
2  | {"a": 2, "b":3}         
...
10  | {"a": 1, "b":1, "c":2}  

如何强制python仅更新 1,A?

这就是我创建数据框的方式:

df = pd.read_csv( file_path, sep='\t', names=['id', 'A'], compression='gzip', converters={1:ast.literal_eval})

【问题讨论】:

  • 听起来您可以查看存储在整个数据框中的字典视图。所以如果你改变一个,你就会改变所有其他的。也许做一个测试,看看 1,A 和 10,A 是否是同一个对象
  • 要添加到@Yuca 的评论中,您应该将一列dicts 视为一列指向dicts 的指针(如果两行具有相同的指针值,您观察到的情况会发生)
  • 有什么想法可以构造 df 来避免这个问题吗? @尤卡
  • 老实说,我没有这方面的经验。你似乎有一个非常干净的结构,所以我的第一个猜测是检查read_csv 的参数是否有帮助
  • @IanS 老实说,对指针进行操作并不是我的本意。他们让自己变得自发......

标签: python python-2.7 pandas dictionary dataframe


【解决方案1】:

正如 cmets 中所确定的,[1, "A"][10, "A"] 中的两个字典是相同的,因此您不能在不更新另一个的情况下更新一个。

虽然我不明白为什么会发生这种情况,但在每个单元格中深度复制字典可以解决问题:

import copy
df = df.applymap(lambda d: copy.deepcopy(d))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-29
    • 2014-12-26
    • 2019-02-11
    • 1970-01-01
    • 2018-01-16
    • 2012-07-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多