[PYTHON] Beispiele und Gegenmaßnahmen für "Ein Wert versucht, auf einer Kopie eines Slice aus einem Datenrahmen festgelegt zu werden." Warnung bei Pandas

Was ich in diesem Artikel schreibe

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

Beispiel für eine Gegenmaßnahme - Geben Sie mit .copy () an, dass es sich um einen anderen DataFrame handelt.

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

Beispiele und Gegenmaßnahmen für "Ein Wert versucht, auf einer Kopie eines Slice aus einem Datenrahmen festgelegt zu werden." Warnung bei Pandas
In Python-Pandas SettingWithCopyWarning Ein Wert versucht, auf einer Kopie eines Slice aus einem DataFrame festgelegt zu werden. Verwenden Sie stattdessen .loc [row_indexer, col_indexer] = value
Ändern Sie den Datenrahmen der Pandas-Kaufdaten (ID x Produkt) in ein Wörterbuch
Erstellen eines Gesichtsbilddatensatzes für maschinelles Lernen (2: Rahmenanalyse von Videos, um Kandidatenbilder zu erhalten)
Was tun, wenn pvcreate viel WARNUNG erzeugt und nicht erstellt werden kann?
Eine Geschichte von Versuch und Irrtum beim Versuch, eine dynamische Benutzergruppe in Slack zu erstellen
Suchen Sie eine Richtlinie für die Anzahl der Prozesse / Threads, die auf dem Anwendungsserver festgelegt werden sollen
Bei matplotlib ist die vertikale Achse auf der linken Seite des Histogramms die Frequenz und die vertikale Achse auf der rechten Seite die relative Frequenz (möglicherweise ein böser Weg).