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
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.
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.
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()
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