2017-09-20 5 views
3

Quelqu'un pourrait-il me expliquer une différence entrepython Pandas dataframe copie (deep = False) vs copie (deep = True) vs '='

df2 = df1 

df2 = df1.copy() 

df3 = df1.copy(deep=False) 

J'ai essayé toutes les options et agirent comme suit:

df1 = pd.DataFrame([1,2,3,4,5]) 
df2 = df1 
df3 = df1.copy() 
df4 = df1.copy(deep=False) 
df1 = pd.DataFrame([9,9,9]) 

et retourné comme suit:

df1: [9,9,9] 
df2: [1,2,3,4,5] 
df3: [1,2,3,4,5] 
df4: [1,2,3,4,5] 

Alors, je vois pas de différence dans la sortie entre .copy() et .copy(deep=False). Pourquoi?

Je me attends à l'une des options '=', copie(), copie (profondeur = False) pour retourner [9,9,9]

Qu'est-ce que je manque s'il vous plaît?

Répondre

3

Si vous voyez les ID d'objet des différents DataFrames que vous créez, vous pouvez voir clairement ce qui se passe.

Lorsque vous écrivez df2 = df1, vous créez une variable nommée df2 et la liez à un objet avec l'ID 4541269200. Lorsque vous écrivez df1 = pd.DataFrame([9,9,9]), vous créez un objet nouvel avec l'ID 4541271120 et le lier à la variable df1, mais l'objet avec l'ID 4541269200 qui était précédemment lié à df1 continue à vivre. S'il n'y avait pas de variables liées à cet objet, il sera récupéré par 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

Salut! Mais quelle est la différence entre df1.copy() et df1.copy (deep = False)? Pouvez-vous améliorer l'exemple pour montrer cette différence? – karolszk

0

copie profonde crée de nouvelles id de chaque objet qu'il contient tout en copie normale ne copie que les éléments de la société mère et crée un nouvel identifiant pour une variable à laquelle il est copié.

La raison pour aucun des df2, df3 et df4 affichage [9,9,9] est:

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'.