Der Hauptzweck besteht darin, eine verkettete Indizierung zu vermeiden und die zu beseitigen SettingWithCopyWarning
.
Hier ist verkettete Indizierung so etwas wie dfc['A'][0] = 111
Das Dokument besagt, dass eine verkettete Indizierung in vermieden werden sollte Rückgabe einer Ansicht gegenüber einer Kopie . Hier ist ein leicht modifiziertes Beispiel aus diesem Dokument:
In [1]: import pandas as pd
In [2]: dfc = pd.DataFrame({'A':['aaa','bbb','ccc'],'B':[1,2,3]})
In [3]: dfc
Out[3]:
A B
0 aaa 1
1 bbb 2
2 ccc 3
In [4]: aColumn = dfc['A']
In [5]: aColumn[0] = 111
SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame
In [6]: dfc
Out[6]:
A B
0 111 1
1 bbb 2
2 ccc 3
Hier aColumn
ist dies eine Ansicht und keine Kopie des ursprünglichen DataFrame. Wenn Sie also Änderungen vornehmen, aColumn
wird das Original erstelltdfc
geändert. Als nächstes, wenn wir zuerst die Zeile indizieren:
In [7]: zero_row = dfc.loc[0]
In [8]: zero_row['A'] = 222
SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame
In [9]: dfc
Out[9]:
A B
0 111 1
1 bbb 2
2 ccc 3
Diesmal zero_row
handelt es sich um eine Kopie, sodass das Original dfc
nicht geändert wird.
Anhand dieser beiden obigen Beispiele sehen wir, dass es nicht eindeutig ist, ob Sie den ursprünglichen DataFrame ändern möchten oder nicht. Dies ist besonders gefährlich, wenn Sie Folgendes schreiben:
In [10]: dfc.loc[0]['A'] = 333
SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame
In [11]: dfc
Out[11]:
A B
0 111 1
1 bbb 2
2 ccc 3
Diesmal hat es überhaupt nicht funktioniert. Hier wollten wir ändern dfc
, aber wir haben tatsächlich einen Zwischenwert geändert dfc.loc[0]
, der eine Kopie ist und sofort verworfen wird. Es ist sehr schwer vorherzusagen, ob der Zwischenwert gefälltdfc.loc[0]
dfc['A']
eine Ansicht oder eine Kopie ist oder ist, daher kann nicht garantiert werden, ob der ursprüngliche DataFrame aktualisiert wird oder nicht. Aus diesem Grund sollte eine verkettete Indizierung vermieden werden, und Pandas generiert das SettingWithCopyWarning
Update für diese Art der verketteten Indizierung.
Jetzt ist die Verwendung von .copy()
. Um die Warnung zu beseitigen, erstellen Sie eine Kopie, um Ihre Absicht ausdrücklich auszudrücken:
In [12]: zero_row_copy = dfc.loc[0].copy()
In [13]: zero_row_copy['A'] = 444 # This time no warning
Da Sie eine Kopie ändern, kennen Sie das Original dfc
ändern niemals ändern wird, und Sie erwarten nicht, dass es sich ändert. Ihre Erwartung entspricht dem Verhalten, dann SettingWithCopyWarning
verschwindet das.
Hinweis: Wenn Sie den ursprünglichen DataFrame ändern möchten, empfiehlt das Dokument die Verwendung von loc
:
In [14]: dfc.loc[0,'A'] = 555
In [15]: dfc
Out[15]:
A B
0 555 1
1 bbb 2
2 ccc 3