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

Zweck

Verhindern Sie, dass die folgenden Warnungen angezeigt werden! (Der Code, der diese Warnung ausgibt, wird unten angezeigt.)

aa.py:5: 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 the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy
  d['col3']= d['col2'] * 3
   col1  col2  col3
0     1     2     6
2     1     2     6

Schauen Sie sich vorerst den schriftlichen Link an

http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy

dfmi.loc[:,('one','second')] = value
# becomes
dfmi.loc.__setitem__((slice(None), ('one', 'second')), value)

Es steht geschrieben.

Code in Frage

aa.py


import pandas as pd

data = pd.DataFrame([[1,2],[2,3],[1,2],[2,3]], columns=['col1','col2'])
d = data[data['col1'] == 1]
d['col3']= d['col2'] * 3
print(d)

Wenn Sie dies tun, erhalten Sie die obige Warnung.

Das Problem liegt in der folgenden Zeile.

d = data[data['col1'] == 1]

Wenn dies "d = Daten" ist, ist die obige Warnung nicht verfügbar.

Ursache & Lösung 1

Da Daten andere Werte als col1 == 1 haben, ist es seltsam, wenn Sie versuchen, dem DF, das durch col1 == 1 ausgeschnitten wurde, eine neue Spalte hinzuzufügen, eine Kopie und nur col1 == 1 im Voraus Mach einfach einen DF.

Überarbeitet


d = data[data['aa'] == 2].copy()

Ursache & Lösung 2

Verwenden Sie .loc wie im obigen Link unterstützt und aktualisieren Sie nur den entsprechenden Teil.

Überarbeitet


#Setzen Sie den Wert (rechte Seite) in Spalte 3 (neue Spalte), obwohl Spalte 1 die Bedingung 1 erfüllt.
data.loc[data['col1'] == 1, 'col3'] = data['col2'] * 3
#Extrahieren Sie nur den Teil, in dem col1 1 ist, aus den Daten
d = data[data['col1'] == 1]
print('data:\n %s' % data)
print('d:\n%s' % d)

Ergebnis


data:
    col1  col2  col3
0     1     2     6
1     2     3   NaN
2     1     2     6
3     2     3   NaN
d:
   col1  col2  col3
0     1     2     6
2     1     2     6

Recommended Posts

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
Beispiele und Gegenmaßnahmen für "Ein Wert versucht, auf einer Kopie eines Slice aus einem Datenrahmen festgelegt zu werden." Warnung bei Pandas
So erhalten Sie den Wert aus dem Parameterspeicher in Lambda (mit Python)
[Python] [Word] [python-docx] Versuchen Sie, mit python-docx eine Vorlage für einen Wortsatz in Python zu erstellen
So finden Sie heraus, ob "irgendwo" von pandas DataFrame einen Wert enthält
So erstellen Sie eine Instanz einer bestimmten Klasse aus dict mit __new__ () in Python
Konvertieren Sie mit Python für .NET von Pandas DataFrame in System.Data.DataTable
So schneiden Sie ein Block-Multiple-Array aus einem Multiple-Array in Python
Ein einfacher Grund, warum der Rückgabewert von round (2.675,2) in Python 2,67 beträgt (in Wirklichkeit sollte er 2,68 betragen ...)
Versuchen Sie, die Thread-Liste der Nachrichten (Abneigung) mit Python zu erhalten.
So ermitteln Sie die Speicheradresse des Pandas-Datenrahmenwerts
Versuchen Sie, sich mit Python auf Ihrem PC automatisch bei Netflix anzumelden
[Python] Was ist ein formales Argument? So stellen Sie den Anfangswert ein
Ein Memorandum, weil ich beim Versuch, MeCab mit Python zu verwenden, gestolpert bin
Versuchen Sie, ein festgelegtes Problem der High-School-Mathematik mit Python zu lösen
Verwenden Sie Ruby und Python, um die Wahrscheinlichkeit zu ermitteln, dass eine Karte mit einer natürlichen Zahl von 1 bis 100 ein Vielfaches von 3 und kein Vielfaches von 5 ist.