Bei der Analyse von Daten mit Pandas
A value is trying to be set on a copy of a slice from a DataFrame.
Ich bekomme oft den Fehler.
Wörtlich übersetzt: "Ein Wert wird einer Kopie eines Slice aus einem Datenrahmen zugewiesen."
Tritt auf, wenn versucht wird, dem Datenrahmen, aus dem unter bestimmten Bedingungen Daten aus dem Datenrahmen extrahiert wurden, einen Wert zuzuweisen.
Dies scheint aufzutreten, wenn unklar ist, ob der Wert im ursprünglichen Datenrahmen wiedergegeben wird, wenn der Wert dem Extraktionszieldatenrahmen zugewiesen wird.
In diesem Zusammenhang werde ich die Fälle und Gegenmaßnahmen zusammenfassen, auf die ich gestoßen bin.
# Umgebung
- python 3.7.4
- pandas 0.25.3
- numpy 1.16.1
# Codebeispiel
## Beispielcode, der eine Warnung ausgibt
```python
#Erstellen Sie einen DataFrame
df = pd.DataFrame(np.arange(20).reshape((4,5)), columns = list("abcde"))
print(df)
# a b c d e
# 0 0 1 2 3 4
# 1 5 6 7 8 9
# 2 10 11 12 13 14
# 3 15 16 17 18 19
df["f"] = 3 #Dies wird nicht als Zuordnung zum Slice betrachtet und es liegt kein Fehler vor
#Von DataFrame".loc"Und Daten extrahieren
#Extrahieren durch Angabe von Bedingungen → Dies wird als Slice angesehen
df_sub = df.loc[df["e"] % 2 == 0]
df_sub["g"] = 100 #Es wird als Zuordnung zum Slice angesehen und eine Warnung ausgegeben.
print(df_sub)
# a b c d e f g
# 0 0 1 2 3 4 3 100
# 2 10 11 12 13 14 3 100
# c:\program files\python37\lib\site-packages\ipykernel_launcher.py:1: 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
# See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
Wenn Sie beim Extrahieren unter Angabe von Bedingungen mit .copy () eindeutig angeben, dass es sich um eine Kopie anstelle eines Slice handelt, wird keine Warnung ausgegeben. Dies bedeutet, dass die Daten im Kopierziel und nicht in der Kopierquelle wiedergegeben werden.
df_sub = df.loc[df["e"] % 2 == 0].copy()
df_sub["g"] = 100
Wenn Sie die Daten in der Kopierquelle wiedergeben möchten, können Sie beispielsweise pd.merge () ausführen.
Recommended Posts