2017-09-20 56 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'.