Eine Warnung, auf die Sie bei der Verwendung von Pandas stoßen können, ist:

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

Diese Warnung erscheint, wenn Pandas auf eine sogenannte Kettenzuweisung stoßen – die Kombination aus Verkettung und Zuweisung in einem Schritt.

Es ist wichtig zu beachten, dass dies lediglich eine Warnung ist, kein Fehler. Ihr Code wird weiterhin ausgeführt, aber die Ergebnisse stimmen möglicherweise nicht immer mit Ihren Erwartungen überein.

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

pd.options.mode.chained_assignment = None

Das folgende Beispiel zeigt, wie dieser Warnung in der Praxis begegnet werden kann.

So reproduzieren Sie die Warnung

Angenommen, wir erstellen den folgenden Pandas DataFrame:

import pandas as pd

#Dataframe erstellen
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]})

#Dataframe anzeigen
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 teilen jeden Wert in Spalte „A“ durch 2:

#neuen Dataframe definieren
df2 = df[['A']]

#Teile alle Werte in Spalte 'A' durch 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“ aus dem ursprünglichen DataFrame festlegen.

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

#neuen Dataframe anzeigen
df2

     A
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 erhalten haben, haben Pandas immer noch das getan, was wir dachten.

Wie man die Warnung vermeidet

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

#neues Dataframe definieren
df2 = df.loc[:, ['A']]

#Teile jeden Wert in Spalte 'A' durch 2
df2['A'] = df['A'] / 2

#zeige Ergebnis
df2

     A
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 wird keine Warnmeldung angezeigt.

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

# verhindern, dass die SettingWithCopyWarnmeldung angezeigt wird
pd.options.mode.chained_assignment = None

Eine ausführliche Erklärung, warum verkettete Zuweisungen vermieden werden sollten, finden Sie in der Online-Dokumentation zu Pandas .

Zusätzliche Ressourcen

Problembehebung: Kein Modul namens pandas
Problembehebung: Kein Modul namens numpy
Problembehebung: Spalten überlappen, aber es wurde kein Suffix angegeben

Statistik: Der Weg zur Datenanalyse

* Amazon Affiliate Link


Das könnte Sie auch interessieren: