wake-up-neo.com

Pandas: SettingWithCopyWarning

Ich möchte Werte in einem PandasDataFrame, die größer als eine beliebige Zahl (in diesem Fall 100) sind, durch NaN ersetzen (da diese Werte ein fehlgeschlagenes Experiment anzeigen) Bisher habe ich dies verwendet, um unerwünschte Werte zu ersetzen:

sve2_all[sve2_all[' Hgtot ng/l'] > 100] = np.nan

Ich habe jedoch folgenden Fehler erhalten:

-c:3: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_index,col_indexer] = value instead
C:\Users\AppData\Local\Enthought\Canopy32\User\lib\site-packages\pandas\core\indexing.py:346: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_index,col_indexer] = value instead
self.obj[item] = s

Von dieser StackExchange-Frage scheint es, dass manchmal diese Warnung ignoriert werden kann, aber ich kann der Diskussion nicht gut genug folgen, um sicher zu sein, ob dies für meine Situation zutrifft. Lässt mich die Warnung im Grunde wissen, dass ich einige Werte in meiner DataFrame überschreibe?

Edit: Soweit ich das beurteilen kann, hat sich alles so verhalten, wie es sollte. Als Folge ist meine Methode, Werte zu ersetzen, nicht standardmässig? Gibt es eine bessere Möglichkeit, Werte zu ersetzen?

18
Jason

Wie in der Fehlermeldung vorgeschlagen, sollten Sie loc dazu verwenden:

sve2_all.loc[sve2_all['Hgtot ng/l'] > 100] = np.nan

Die Warnung ist hier, um das Ändern einer Kopie zu stoppen (hier ist sve2_all[sve2_all[' Hgtot ng/l'] > 100] ist möglicherweise eine Kopie, und wenn dies der Fall ist, würden Änderungen den ursprünglichen Rahmen nicht ändern. Es könnte sein, dass er in einigen Fällen korrekt funktioniert, aber Pandas Ich kann nicht garantieren, dass es in allen Fällen funktioniert ... Verwendung auf eigene Gefahr (betrachten Sie sich als gewarnt!);)).

23
Andy Hayden

--- Problem für mich gelöst ---

Ich hatte diesen kriegerischen Fehler, als ich versuchte, float -> int zu konvertieren, selbst wenn ich den Befehl ".loc" verwendete. Mein Fehler war, dass ich meinen dataFrame (mit Masken) vor der Operation gefiltert habe, sodass die Konvertierung nur in einem kleinen Teil des DataFrame-Elements/der Spalte erfolgte. Das Ergebnis war eine gemischte Typspalte, die eine Verwirrung erzeugt. Ich habe das Problem gelöst, indem ich den Datenrahmen vor den Masken konvertiert habe (Datenfilterung). Ich hoffe, es wird helfen.

2
ilyes

Diese Warnung wurde beim Versuch angezeigt, den Inhalt eines gesamten DataFrame zurückzusetzen, konnte jedoch nicht mit loc oder iloc aufgelöst werden:

df.loc[:, :] = new_values # SettingWithCopyWarning
df.iloc[:, :] = new_values # SettingWithCopyWarning

Aber das Auflösen des als Daten enthaltenen ndarray löste das Problem:

df.values[:, :] = new_values # no warnings and desired behavior
2

Wie von anderen Benutzern vorgeschlagen, können Sie Folgendes versuchen:

myindex = sve2_all[' Hgtot ng/l'] > 100

sve2_all.loc[myindex, 'yourcolumn'] = np.nan

Beachten Sie, dass Sie bei Problemen beim Erstellen von Pivot-Tabellen (Schlüsselwort row, das nicht von pandas 0.16.0 #417 unterstützt wird) die neue Syntax von Index und Spalten anstelle von Zeilen und Spalten verwenden sollten. https://github.com/yhat/ggplot/issues/417

Siehe auch:

Pandas SettingWithCopyWarning

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

1
George Zoto