Bevor Sie mit diesem Beitrag fortfahren, ist es wichtig, den Unterschied zwischen NaN und None zu verstehen . Einer ist ein Float-Typ, der andere ist ein Objekttyp. Pandas eignet sich besser für die Arbeit mit Skalartypen, da viele Methoden für diese Typen vektorisiert werden können. Pandas versucht zwar, None und NaN konsistent zu behandeln, NumPy jedoch nicht.
Mein Vorschlag ( und der von Andy ) ist, bei NaN zu bleiben.
Aber um Ihre Frage zu beantworten ...
pandas> = 0.18: na_values=['-']
Argument mit verwendenread_csv
Wenn Sie diese Daten aus CSV / Excel geladen haben, habe ich gute Nachrichten für Sie. Sie können dies während des Ladens der Daten im Stammverzeichnis löschen, anstatt als nachfolgenden Schritt einen Fix mit Code schreiben zu müssen.
Die meisten pd.read_*
Funktionen (wie read_csv
und read_excel
) akzeptieren ein na_values
Attribut.
file.csv
A,B
-,1
3,-
2,-
5,3
1,-2
-5,4
-1,-1
-,0
9,0
-
Um die Zeichen in NaNs umzuwandeln, tun Sie Folgendes:
import pandas as pd
df = pd.read_csv('file.csv', na_values=['-'])
df
A B
0 NaN 1.0
1 3.0 NaN
2 2.0 NaN
3 5.0 3.0
4 1.0 -2.0
5 -5.0 4.0
6 -1.0 -1.0
7 NaN 0.0
8 9.0 0.0
Ähnliches gilt für andere Funktionen / Dateiformate.
PS: In Version 0.24 + können Sie den Integer-Typ beibehalten, auch wenn Ihre Spalte NaNs enthält (ja, sprechen Sie davon, den Kuchen zu haben und ihn auch zu essen). Sie können angebendtype='Int32'
df = pd.read_csv('file.csv', na_values=['-'], dtype='Int32')
df
A B
0 NaN 1
1 3 NaN
2 2 NaN
3 5 3
4 1 -2
5 -5 4
6 -1 -1
7 NaN 0
8 9 0
df.dtypes
A Int32
B Int32
dtype: object
Der dtype ist kein herkömmlicher int-Typ ... sondern ein nullable Integer Type. Es gibt andere Möglichkeiten.
Umgang mit numerischen Daten: pd.to_numeric
miterrors='coerce
Wenn Sie mit numerischen Daten arbeiten, besteht eine schnellere Lösung darin, pd.to_numeric
das errors='coerce'
Argument zu verwenden, das ungültige Werte (Werte, die nicht in numerische Werte umgewandelt werden können) zu NaN zwingt.
pd.to_numeric(df['A'], errors='coerce')
0 NaN
1 3.0
2 2.0
3 5.0
4 1.0
5 -5.0
6 -1.0
7 NaN
8 9.0
Name: A, dtype: float64
Verwenden Sie, um den (nullbaren) ganzzahligen Typ beizubehalten
pd.to_numeric(df['A'], errors='coerce').astype('Int32')
0 NaN
1 3
2 2
3 5
4 1
5 -5
6 -1
7 NaN
8 9
Name: A, dtype: Int32
Verwenden Sie zum Erzwingen mehrerer Spalten apply
:
df[['A', 'B']].apply(pd.to_numeric, errors='coerce').astype('Int32')
A B
0 NaN 1
1 3 NaN
2 2 NaN
3 5 3
4 1 -2
5 -5 4
6 -1 -1
7 NaN 0
8 9 0
... und ordnen Sie das Ergebnis danach wieder zu.
Weitere Informationen finden Sie in dieser Antwort .
write_frame
nichtNaN
s zunone
s?