Ersetzen Sie ungültige Werte, die mit Keiner in Pandas DataFrame
Gibt es eine Methode, um Werte zu ersetzen mit None
im Pandas in Python?
Können Sie df.replace('pre', 'post')
und ersetzen können Sie einen Wert mit einem anderen, aber dies kann nicht getan werden, wenn Sie ersetzen möchten, mit None
Wert, die, wenn Sie versuchen, erhalten Sie eine seltsame Folge.
Hier also ein Beispiel:
df = DataFrame(['-',3,2,5,1,-5,-1,'-',9])
df.replace('-', 0)
welche gibt ein erfolgreiches Ergebnis zurück.
Aber,
df.replace('-', None)
das gibt einen folgenden Ergebnis:
0
0 - // this isn't replaced
1 3
2 2
3 5
4 1
5 -5
6 -1
7 -1 //this is changed to `-1`...
8 9
Warum so ein komisches Ergebnis zurückgegeben werden?
Da will ich Gießen Sie das Daten-frame in der MySQL-Datenbank, ich kann nicht NaN
Werte in jedem element, in meine Daten-frame und statt setzen wollen None
. Sicherlich, Sie können die erste änderung '-'
zu NaN
konvertieren und dann NaN
zu None
, aber ich möchte wissen, warum der dataframe wirkt in so eine schreckliche Art und Weise.
Getestet auf pandas 0.12.0 dev auf Python 2.7 und OS X 10.8. Python ist eine
pre-installierte version auf OS X installiert und ich pandas durch die Verwendung von SciPy
Super Pack Skript, für Ihre Informationen.
- Hat die
write_frame
nicht analysierenNaN
s zunone
s? - Yup. Sie begegnen
InternalError: (1054, u"Unknown column 'nan' in 'field list'")
Fehler. Ich weiß nicht, über Lösungen, die auf anderen als UmwandlungNaN
zuNone
vor der Ausführungwrite_frame
Methode. - Welche version von pandas sind verwenden Sie?
- Scipy super pack gibt dev? Ok, gut ich denke auf jeden Fall sollten Sie heben Sie es als ein Problem, auf github, sollte nicht allzu schwer zu beheben ist.
- Wenn Sie dieses Lesen von Daten aus CSV - /Excel, können Sie Lesen Sie diese Werte wie NaN mit
na_values
argument. Weitere Informationen in dieser Antwort.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Tatsächlich in späteren Versionen von pandas so wird ein TypeError:
Können Sie die übergabe entweder eine Liste oder ein dictionary:
Aber ich empfehle die Verwendung von NaNs lieber als gar Keine:
df.replace(['-'], [None])
oderdf.replace({'-': None})
, denke ich. Die Verwendung vonNone
als Wächter schließt er Sie als einen Wert zu..df
zurück zu sich selbst wie:df = df.replace({'?': np.nan})
where
ist wahrscheinlich das, was du bist suchen für. SoAus der panda docs:
Bevorzuge ich die Lösung mit
replace
mit einemdict
wegen seiner Einfachheit und Eleganz:Können Sie auch mehrere Ersetzungen:
Und auch für größere Ersatz, es ist immer offensichtlich und klar, was ist ersetzt durch das, was - was ist härter für lange Listen, meiner Meinung nach.
(v0.24+) Eine Bessere Lösung für CSV - /Excel-Daten:
na_values=['-']
Wenn Sie geladen haben, diese Daten aus CSV/Excel, ich habe gute Nachrichten für Sie. Sie können Niederschlagung dieser an der Wurzel beim laden der Daten anstatt zu schreiben, ein Update mit code als einen weiteren Schritt.
Meisten
pd.read_*
Funktionen (wieread_csv
undread_excel
) akzeptierenna_values
Attribut.file.csv
Nun, zum konvertieren der
-
Zeichen in NaN zu tun,Und ähnlich für andere Funktionen/Datei-Formate.
P. S.: Auf v0.24+, Sie können bewahren integer-Typ, auch wenn Ihre Spalte NaNs (ja, sprechen Sie über den Kuchen und Essen es auch). Sie können angeben
dtype='Int32'
Den "dtype" ist nicht ein herkömmlicher Typ int... sondern ein Nullable-Integer-Typ. gibt Es andere Möglichkeiten.
Umgang mit Numerischen Daten:
pd.to_numeric
miterrors='coerce
Wenn Sie den Umgang mit numerischen Daten, eine schnellere Lösung ist die Verwendung
pd.to_numeric
mit dererrors='coerce'
argument, das zwingt ungültige Werte (Werte, die nicht Stimmen, um numerisch) zu NaN.Behalten (nullable) integer dtype, verwenden Sie
Zu zwingen, mehrere Spalten, verwenden Sie
apply
:...und weisen das Ergebnis wieder nach.
Mehr Informationen finden Sie in diese Antwort.
Einstellung null-Werte kann man mit
np.nan
:Vorteil ist, dass
df.last_valid_index()
erkennt diese als ungültig.