2017-09-20 54 views
3

有人能向我解释蟒蛇熊猫数据框复制(深= 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]

我在想什么吗?

回答

3

如果您看到您创建的各种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. 
+1

嗨!但是df1.copy()和df1.copy(deep = False)有什么区别?你可以改进示例来展示这种差异吗? – karolszk

0

深层复制创建的每一个新ID的对象包含正常时只复制副本来自父元素,并创建一个变量一个新的ID,以它复制到。

原因都不df2df3df4显示[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'.