熊猫数据框和字典的深层副本

时间:2020-01-10 14:01:31

标签: 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)如何获取完全独立的数据框副本?

感谢您的帮助!

干杯, 尼古拉斯

1 个答案:

答案 0 :(得分:3)

免责声明


请注意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))  

希望我已经回答了你的问题。如有需要,请随时要求任何澄清。