python - Pandas 数据框和字典的深度复制

标签 python pandas dictionary copy

我正在创建一个小型 Pandas 数据框:

df = pd.DataFrame(data={'colA': [["a", "b", "c"]]})

我对该 df 进行了深度复制。我没有使用 Pandas 方法,而是使用通用 Python,对吧?

import copy
df_copy = copy.deepcopy(df)

df_copy.head() 给出以下内容:

enter image description here

然后我将这些值放入字典中:

mydict = df_copy.to_dict()

该字典看起来像这样:

enter image description here

最后,我删除列表中的一项:

mydict['colA'][0].remove("b")

令我惊讶的是 df_copy 中的值已更新。我非常困惑原始数据框中的值也更新了!两个数据框现在看起来都是这样的:

enter image description here

我知道 Pandas 并没有真正进行深度复制,但这不是 Pandas 方法。我的问题是:

1)如何从不更新数据帧的数据帧构建字典?

2)如何获取完全独立的数据帧的副本?

感谢您的帮助!

干杯, 尼古拉斯

最佳答案

免责声明

<小时/>

请注意 putting mutable objects inside a DataFrame can be an antipattern因此,请确保您确实需要它并且您了解自己在做什么。

为什么你的文案不独立

<小时/>

应用于对象时,copy.deepcopy 为 looked up for a _deepcopy_ method of that object, that is called in turn 。添加它是为了避免复制太多对象。对于 DataFrame 实例 in version 0.20.0 and above - _deepcopy_ doesn`t work recursively .

同样,如果您将使用DataFrame.copy(deep=True) deep copy will copy the data, but will not do so recursively.

如何解决问题

<小时/>

要获取包含列表(或其他 python 对象)的 DataFrame 的真正深拷贝,使其独立 - 您可以使用以下方法之一。

df_copy = pd.DataFrame(columns = df.columns, data = copy.deepcopy(df.values))

对于字典,您可以使用相同的技巧:

mydict = pd.DataFrame(columns = df.columns, data = copy.deepcopy(df_copy.values)).to_dict()
mydict['colA'][0].remove("b")

There's also a standard hacky way of deep-copying python objects:

import pickle
df_copy = pickle.loads(pickle.dumps(df))  

如果需要,请随时要求任何澄清。

关于python - Pandas 数据框和字典的深度复制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59683237/

相关文章:

python - 在字典理解中创建字典

python - 在自定义像素网格上移动 Canvas 上的矩形

python - 无法复制只与我共享的文件

python - 在 Python 中搜索 XML 内容

python - 数据帧循环中的 if/else 语句

python - Pandas:用于匹配行索引 - 使用具有不同列大小的其他数据帧的值更新数据帧值

Pandas:使用方法链接替换某些列的特定行值

python - 使用解析数据的元组初始化字典

swift - 在 Swift 中检查字符串是否包含字典中的子字符串之一

c++ - 对存储在 std::map 中的值调用方法