Ich möchte Werte in einem Pandas
DataFrame
, 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?
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!);)).
--- 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.
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
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:
http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy