python Pandas DataFrame copy (deep=False) vs copy (deep=True) vs'='

Mógłby mi ktoś wyjaśnić różnicę między

df2 = df1

df2 = df1.copy()

df3 = df1.copy(deep=False)

Wypróbowałem wszystkie opcje i zrobiłem tak:

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

I zwrócone w następujący sposób:

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

Nie widzę więc różnicy w wyjściu pomiędzy .copy() i .copy(deep=False). Dlaczego?

Spodziewałbym się, że jedna z opcji'=', copy (), copy (deep=False) zwróci [9,9,9]

Co mi umyka?
Author: icedwater, 2017-09-20

3 answers

Jeśli widzisz ID obiektów różnych ramek danych, które tworzysz, możesz wyraźnie zobaczyć, co się dzieje.

Kiedy piszesz df2 = df1, tworzysz zmienną o nazwie df2 i wiążesz ją z obiektem o id 4541269200. Kiedy piszesz df1 = pd.DataFrame([9,9,9]), tworzysz nowy obiekt o id 4541271120 i wiążesz go ze zmienną df1, ale obiekt o id 4541269200, który był wcześniej związany z df1, nadal działa. Jeśli nie było żadnych zmiennych związanych z tym obiektem, zostanie on usunięty zebrane przez Pythona.

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.

Edycja: Dodano 30/07/2018

[[11]}Głębokie kopiowanie Nie działa w pandach i deweloperzy rozważają umieszczenie mutowalnych obiektów wewnątrz ramki danych jako antypattern. Rozważmy następujące:
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, jeśli była to prawdziwa głęboka kopia, powinna mieć nowe identyfikatory dla list w niej zawartych. W rezultacie, gdy modyfikujesz listę wewnątrz df2, wpływa ona również na listę wewnątrz df1, ponieważ są to te same obiekty.

 36
Author: Karthik V,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-31 02:17:58

Deep copy tworzy nowe id każdego obiektu, który zawiera, podczas gdy normalna Kopia kopiuje tylko elementy z rodzica i tworzy nowy id dla zmiennej, do której jest kopiowana.

Powód, dla którego żaden z df2, df3 and df4 displaying [9,9,9] is:

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'.
 3
Author: Aman Agrawal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-26 15:00:08

Musisz zmodyfikować elementy df indywidualnie. Wypróbuj następujące

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)
 2
Author: flysoon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-19 04:59:30