有人可以向我解释
之间的区别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]
我想念什么?
如果您看到您创建的各种数据框的对象ID,则可以清楚地看到正在发生的事情。
编写df2 = df1
时,您正在创建一个名为 df2
的变量,并使用具有ID 4541269200
的对象绑定。当您编写df1 = pd.DataFrame([9,9,9])
时,您将创建具有ID 4541271120
的新对象,并将其绑定到可变df1
,但是具有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.
编辑:添加于7/30/2018
深层复制在大熊猫中不起作用,开发人员认为将可变的物体放在数据框架中作为对抗图案。考虑以下内容:
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内的列表,因为它们是相同的对象。
deep copy创建所包含的每个对象的新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'.
您需要单独修改DF的元素。尝试以下
df1 = pd.DataFrame([1,2,3,4,5])
df2 = df1
df3 = df1.copy()
df4 = df1.copy(deep=False)
df1.iloc[0,0] = 6
df2.iloc[1,0] = 7
df4.iloc[2,0] = 8
print(df1)
print(df2)
print(df3)
print(df4)
df1: df2: df3: df4:
0 0 0 0
0 6 0 6 0 1 0 6
1 7 1 7 1 2 1 7
2 8 2 8 2 3 2 8
3 4 3 4 3 4 3 4
4 5 4 5 4 5 4 5