【问题标题】:Deep copy of Pandas dataframes and dictionariesPandas 数据框和字典的深拷贝
【发布时间】:2020-04-28 04:41:57
【问题描述】:

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

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

我对那个 df 做了一个深拷贝。我没有使用 Pandas 方法,而是使用通用 Python,对吗?

import copy
df_copy = copy.deepcopy(df)

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

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

mydict = df_copy.to_dict()

那个字典看起来像这样:

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

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

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

我知道 Pandas 并没有真正做 deepcopy,但这不是 Pandas 的方法。我的问题是:

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

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

感谢您的帮助!

干杯, 尼古拉斯

【问题讨论】:

  • 您是否尝试对字典而不是数据框进行深度复制?
  • @Nicolas 如果您对答案感到满意 - 如果您可以将答案标记为正确,那就太好了。如果您仍有一些问题 - 请随时填写以进行任何澄清。
  • 感谢 Stas,完美,如我所愿!

标签: python pandas dictionary copy


【解决方案1】:

免责声明


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

如有需要,请随时要求澄清。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-24
    • 1970-01-01
    • 2012-04-12
    • 1970-01-01
    • 2015-01-13
    • 1970-01-01
    • 2020-11-06
    • 1970-01-01
    相关资源
    最近更新 更多