蟒蛇熊猫数据框复制(深= FALSE)VS副本(深= TRUE)VS“=”
问题描述:
有人能向我解释蟒蛇熊猫数据框复制(深= FALSE)VS副本(深= 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(deep=False)
。为什么?
我期望的选项 '=' 一个,复制(),复制(深= FALSE)返回[9,9,9]
我在想什么吗?
答
如果您看到您创建的各种DataFrame的对象ID,您可以清楚地看到发生了什么。
当您编写df2 = df1
时,您正在创建一个名为df2
的变量,并将其与具有编号为4541269200
的对象绑定。当您编写df1 = pd.DataFrame([9,9,9])
时,您正在创建一个新的对象,其编号为4541271120
,并将其绑定到变量df1
,但之前绑定到df1
的编号为4541269200
的对象继续存在。如果没有绑定到该对象的变量,它将被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.
答
深层复制创建的每一个新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'.
嗨!但是df1.copy()和df1.copy(deep = False)有什么区别?你可以改进示例来展示这种差异吗? – karolszk