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 aColumnist dies eine Ansicht und keine Kopie des ursprünglichen DataFrame. Wenn Sie also Änderungen vornehmen, aColumnwird 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 dfcnicht 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 SettingWithCopyWarningUpdate 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 SettingWithCopyWarningverschwindet 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