Bei der Auswahl eines Unterdatenrahmens aus einem übergeordneten Datenrahmen habe ich festgestellt, dass einige Programmierer mit dieser .copy()
Methode eine Kopie des Datenrahmens erstellen .
Warum machen sie eine Kopie des Datenrahmens? Was passiert, wenn ich keine Kopie mache?
python
pandas
chained-assignment
Elizabeth Susan Joseph
quelle
quelle
Antworten:
Dies erweitert die Antwort von Paulus. In Pandas gibt die Indizierung eines DataFrame einen Verweis auf den ursprünglichen DataFrame zurück. Durch Ändern der Teilmenge wird daher der anfängliche DataFrame geändert. Daher möchten Sie die Kopie verwenden, wenn Sie sicherstellen möchten, dass sich der ursprüngliche DataFrame nicht ändert. Betrachten Sie den folgenden Code:
Du wirst kriegen:
Im Gegensatz dazu bleibt df unverändert:
quelle
Wenn Sie keine Kopie erstellen, können die Indizes auch dann an anderer Stelle bearbeitet werden, wenn Sie den dataFrame einem anderen Namen zuweisen.
Beispielsweise:
func1 kann df durch Ändern von df2 ändern, um Folgendes zu vermeiden:
quelle
, both variables reference the same DataFrame instance. So any changes made to
" oderdf2
für dieselbe Objektinstanz erstellt wird. Während in derdf2 = df.copy()
zweiten Objektinstanz eine Kopie der ersten erstellt wird, werden jetztdf
und unterdf2
Bezugnahme auf verschiedene Objektinstanzen und etwaige Änderungen an der jeweiligen DataFrame-Instanz vorgenommen.Es muss erwähnt werden, dass die Rückgabe von Kopien oder Ansichten von der Art der Indizierung abhängt.
In der Pandas-Dokumentation heißt es:
quelle
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:
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:Diesmal
zero_row
handelt es sich um eine Kopie, sodass das Originaldfc
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:
Diesmal hat es überhaupt nicht funktioniert. Hier wollten wir ändern
dfc
, aber wir haben tatsächlich einen Zwischenwert geändertdfc.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 dasSettingWithCopyWarning
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: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, dannSettingWithCopyWarning
verschwindet das.Hinweis: Wenn Sie den ursprünglichen DataFrame ändern möchten, empfiehlt das Dokument die Verwendung von
loc
:quelle
Im Allgemeinen ist es sicherer, an Kopien zu arbeiten als an Originaldatenrahmen, es sei denn, Sie wissen, dass Sie das Original nicht mehr benötigen und mit der manipulierten Version fortfahren möchten. Normalerweise kann der ursprüngliche Datenrahmen immer noch mit der manipulierten Version usw. verglichen werden. Daher arbeiten die meisten Benutzer an Kopien und führen diese am Ende zusammen.
quelle
Angenommen, Sie haben einen Datenrahmen wie unten
Wenn Sie eine andere erstellen möchten,
df2
die mitdf1
, ohne identisch istcopy
Und möchte den df2-Wert nur wie folgt ändern
Gleichzeitig wird auch der df1 geändert
Da zwei df gleich sind
object
, können wir es mit dem überprüfenid
Sie übergeben also als dasselbe Objekt und ändern ein anderes den gleichen Wert.
Wenn wir das hinzufügen
copy
, und jetztdf1
unddf2
werden als unterschiedlich angesehenobject
, wenn wir die gleiche Änderung an einer von ihnen tun das andere wird sich nicht ändern.Gut zu erwähnen, wenn Sie den ursprünglichen Datenrahmen unterteilen, ist es sicher, auch die Kopie hinzuzufügen, um das zu vermeiden
SettingWithCopyWarning
quelle