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

Nic*_*las 6 python dictionary copy pandas

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

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

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

import copy
df_copy = copy.deepcopy(df)
Run Code Online (Sandbox Code Playgroud)

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

在此输入图像描述

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

mydict = df_copy.to_dict()
Run Code Online (Sandbox Code Playgroud)

该字典看起来像这样:

在此输入图像描述

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

mydict['colA'][0].remove("b")
Run Code Online (Sandbox Code Playgroud)

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

在此输入图像描述

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

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

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

感谢您的帮助!

干杯,尼古拉斯

Sta*_*luk 12

总长DR

要获得深度复制:
df_copy = pd.DataFrame(columns = df.columns, data = copy.deepcopy(df.values))

免责声明


请注意,将可变对象放入 DataFrame 中可能是一种反模式,因此请确保您确实需要它并且了解您在做什么。

为什么你的副本不独立


当应用于对象时,会查找 copy.deepcopy 来查找该对象的 _ deepcopy _ 方法,并依次调用该方法。添加它是为了避免复制太多对象。对于版本 0.20.0 及更高版本的 DataFrame 实例 - _ deepcopy _ 不能递归工作

同样,如果您将使用DataFrame.copy(deep=True) 深复制,则会复制数据,但不会递归地执行此操作。

如何解决问题


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

df_copy = pd.DataFrame(columns = df.columns, data = copy.deepcopy(df.values))
Run Code Online (Sandbox Code Playgroud)

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

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

还有一种深度复制 python 对象的标准 hacky 方法:

import pickle
df_copy = pickle.loads(pickle.dumps(df))  
Run Code Online (Sandbox Code Playgroud)

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