So beheben sie das problem in pandas: settingwithcopywarning


Eine Warnung, die bei der Verwendung von Pandas auftreten kann, ist:

 SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame.

Diese Warnung erscheint, wenn Pandas auf etwas stoßen, das als Kettenzuweisung bezeichnet wird – die Kombination aus Verkettung und Zuweisung in einem Schritt.

Es ist wichtig zu beachten, dass es sich lediglich um eine Warnung und nicht um einen Fehler handelt. Ihr Code wird weiterhin ausgeführt, aber die Ergebnisse entsprechen möglicherweise nicht immer Ihren Erwartungen.

Der einfachste Weg, diese Warnung zu unterdrücken, ist die Verwendung des folgenden Codeabschnitts:

 p.d. options . fashion . chained_assignment = None

Das folgende Beispiel zeigt, wie auf diese Warnung in der Praxis reagiert werden kann.

So reproduzieren Sie die Warnung

Angenommen, wir erstellen den folgenden Pandas-DataFrame:

 import pandas as pd

#createDataFrame
df = pd. DataFrame ({' A ': [25, 12, 15, 14, 19, 23, 25, 29],
                   ' B ': [5, 7, 7, 9, 12, 9, 9, 4],
                   ' C ': [11, 8, 10, 6, 6, 5, 9, 12]})

#view DataFrame
df

	A B C
0 25 5 11
1 12 7 8
2 15 7 10
3 14 9 6
4 19 12 6
5 23 9 5
6 25 9 9
7 29 4 12

Nehmen wir nun an, wir erstellen einen neuen DataFrame, der nur Spalte „A“ aus dem ursprünglichen DataFrame enthält, und dividieren jeden Wert in Spalte „A“ durch 2:

 #define new DataFrame
df2 = df[[' A ']]

#divide all values in column 'A' by 2
df2[' A '] = df[' A '] / 2

/srv/conda/envs/notebook/lib/python3.7/site-packages/ipykernel_launcher.py:2:
SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead

Wir erhalten die SettingWithCopyWarning -Nachricht, weil wir neue Werte für Spalte „A“ auf einem „Slice“ des ursprünglichen DataFrame festlegen.

Wenn wir uns jedoch den neuen DataFrame ansehen, den wir erstellt haben, werden wir feststellen, dass jeder Wert tatsächlich erfolgreich durch 2 geteilt wurde:

 #view new DataFrame
df2

     HAS
0 12.5
1 6.0
2 7.5
3 7.0
4 9.5
5 11.5
6 12.5
7 14.5

Obwohl wir eine Warnmeldung erhielten, taten die Pandas immer noch das, was wir erwartet hatten.

So vermeiden Sie die Warnung

Um diese Warnung zu vermeiden, wird empfohlen, die Syntax .loc[row indexer, col indexer] wie folgt zu verwenden:

 #define new DataFrame
df2 = df. loc [:,[' A ']]

#divide each value in column 'A' by 2
df2[' A '] = df[' A '] / 2

#view result
df2

     HAS
0 12.5
1 6.0
2 7.5
3 7.0
4 9.5
5 11.5
6 12.5
7 14.5

Der neue DataFrame enthält alle Werte aus Spalte „A“ im ursprünglichen DataFrame, geteilt durch zwei, und es werden keine Warnmeldungen angezeigt.

Wenn wir verhindern möchten, dass die Warnmeldung angezeigt wird, können wir den folgenden Code verwenden:

 #prevent SettingWithCopyWarning message from appearing
p.d. options . fashion . chained_assignment = None

Eine detaillierte Erklärung, warum die Kettenzuweisung vermieden werden sollte, finden Sie in der Online-Pandas-Dokumentation .

Zusätzliche Ressourcen

Problembehebung: Kein Modul mit dem Namen pandas
Problembehebung: Kein Modul namens Numpy
Lösung: Spalten überschneiden sich, es ist jedoch kein Suffix angegeben

Einen Kommentar hinzufügen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert