python Pandas DataFrame copy(deep=False) vs copy(deep=True) vs '='

新手上路,请多包涵

有人可以向我解释两者之间的区别吗

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 许可协议

阅读 513
2 个回答

如果你看到你创建的各种 DataFrame 的对象 ID,你可以清楚地看到发生了什么。

当您编写 df2 = df1 时,您正在创建一个名为 df2 的变量,并将其与 ID 为 4541269200 的对象绑定When you write df1 = pd.DataFrame([9,9,9]) , you are creating a new object with id 4541271120 and binding it to variable df1 , but the object with id 4541269200 之前绑定到 df1 继续存在。如果没有变量绑定到该对象,它将被 Python 收集为垃圾。

 In[33]: import pandas as pd
In[34]: df1 = pd.DataFrame([1,2,3,4,5])
In[35]: id(df1)
Out[35]: 4541269200

In[36]: df2 = df1
In[37]: id(df2)
Out[37]: 4541269200  # Same id as df1

In[38]: df3 = df1.copy()
In[39]: id(df3)
Out[39]: 4541269584  # New object, new id.

In[40]: df4 = df1.copy(deep=False)
In[41]: id(df4)
Out[41]: 4541269072  # New object, new id.

In[42]: df1 = pd.DataFrame([9, 9, 9])
In[43]: id(df1)
Out[43]: 4541271120  # New object created and bound to name 'df1'.

In[44]: id(df2)
Out[44]: 4541269200  # Old object's id not impacted.

编辑:添加于 2018 年 7 月 30 日

深度复制 在 pandas 中不起作用, 开发人员考虑将可变对象放入 DataFrame 中作为反模式。考虑以下:

 In[10]: arr1 = [1, 2, 3]
In[11]: arr2 = [1, 2, 3, 4]
In[12]: df1 = pd.DataFrame([[arr1], [arr2]], columns=['A'])
In[13]: df1.applymap(id)
Out[13]:
            A
0  4515714832
1  4515734952

In[14]: df2 = df1.copy(deep=True)
In[15]: df2.applymap(id)
Out[15]:
            A
0  4515714832
1  4515734952

In[16]: df2.loc[0, 'A'].append(55)
In[17]: df2
Out[17]:
               A
0  [1, 2, 3, 55]
1   [1, 2, 3, 4]
In[18]: df1
Out[18]:
               A
0  [1, 2, 3, 55]
1   [1, 2, 3, 4]

df2 ,如果它是真正的深层副本,则应该为其中包含的列表提供新的 ID。因此,当您修改 df2 中的列表时,它也会影响 df1 中的列表,因为它们是相同的对象。

原文由 Karthik V 发布,翻译遵循 CC BY-SA 4.0 许可协议

深拷贝为它包含的每个对象创建新的 id,而普通拷贝只从父对象复制元素并为它被复制到的变量创建一个新的 id。

没有 df2 , - , df3 df4 [9,9,9]

 In[33]: import pandas as pd
In[34]: df1 = pd.DataFrame([1,2,3,4,5])
In[35]: id(df1)
Out[35]: 4541269200

In[36]: df2 = df1
In[37]: id(df2)
Out[37]: 4541269200  # Same id as df1

In[38]: df3 = df1.copy()
In[39]: id(df3)
Out[39]: 4541269584  # New object, new id.

In[40]: df4 = df1.copy(deep=False)
In[41]: id(df4)
Out[41]: 4541269072  # New object, new id.

In[42]: df1 = pd.DataFrame([9, 9, 9])
In[43]: id(df1)
Out[43]: 4541271120  # New object created and bound to name 'df1'.

原文由 Aman Agrawal 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题