有人可以向我解释两者之间的区别吗
df2 = df1
df2 = df1.copy()
df3 = df1.copy(deep=False)
我已经尝试了所有选项并执行了以下操作:
df1 = pd.DataFrame([1,2,3,4,5])
df2 = df1
df3 = df1.copy()
df4 = df1.copy(deep=False)
df1 = pd.DataFrame([9,9,9])
并返回如下:
df1: [9,9,9]
df2: [1,2,3,4,5]
df3: [1,2,3,4,5]
df4: [1,2,3,4,5]
因此,我观察到 .copy()
和 .copy(deep=False)
之间的输出没有差异。为什么?
我希望其中一个选项 ‘=’, copy(), copy(deep=False) 返回 [9,9,9]
请问我错过了什么?
原文由 Dariusz Krynicki 发布,翻译遵循 CC BY-SA 4.0 许可协议
如果你看到你创建的各种 DataFrame 的对象 ID,你可以清楚地看到发生了什么。
当您编写
df2 = df1
时,您正在创建一个名为df2
的变量,并将其与 ID 为4541269200
的对象绑定When you writedf1 = pd.DataFrame([9,9,9])
, you are creating a new object with id4541271120
and binding it to variabledf1
, but the object with id4541269200
之前绑定到df1
继续存在。如果没有变量绑定到该对象,它将被 Python 收集为垃圾。编辑:添加于 2018 年 7 月 30 日
深度复制 在 pandas 中不起作用, 开发人员考虑将可变对象放入 DataFrame 中作为反模式。考虑以下:
df2
,如果它是真正的深层副本,则应该为其中包含的列表提供新的 ID。因此,当您修改 df2 中的列表时,它也会影响 df1 中的列表,因为它们是相同的对象。