
Bei Pandas wird ein fehlender Wert (NA: nicht verfügbar) hauptsächlich durch nan (keine Zahl) dargestellt. Keiner wird auch als fehlender Wert betrachtet.
Dieser Artikel hat folgenden Inhalt.
- Fehlende Werte, verursacht durch das Lesen von Dateien usw.
- nan (keine Zahl) wird als fehlender Wert betrachtet
- Keiner wird auch als fehlender Wert betrachtet
- String wird nicht als fehlender Wert betrachtet
- Infinity inf wird standardmäßig nicht als fehlender Wert angesehen
- pd.NA ist der experimentelle Wert (ab 1.4.0)
Fehlende Werte, verursacht durch das Lesen von Dateien usw.
Wenn Sie eine CSV-Datei mit fehlenden Werten lesen, wird nan generiert. In der print()-Ausgabe von pandas.DataFrame und Series wird es als NaN geschrieben.
import math
import numpy as np
import pandas as pd
df = pd.read_csv('data/src/sample_pandas_normal_nan.csv')[:3]
print(df)
# name age state point other
# 0 Alice 24.0 NY NaN NaN
# 1 NaN NaN NaN NaN NaN
# 2 Charlie NaN CA NaN NaN
Methoden wie isnull(), dropna() und fillna() can used Werden, um fehlende Werte zu erkennen, zu entfernen und zu ersetzen.
print(df.isnull())
# name age state point other
# 0 False False False True True
# 1 True True True True True
# 2 False True False True True
print(df.dropna(how='all'))
# name age state point other
# 0 Alice 24.0 NY NaN NaN
# 2 Charlie NaN CA NaN NaN
print(df.fillna(0))
# name age state point other
# 0 Alice 24.0 NY 0.0 0.0
# 1 0 0.0 0 0.0 0.0
# 2 Charlie 0.0 CA 0.0 0.0
nan in einer Spalte mit Objekt ist ein in Python integrierter Float-Typ, und nan in einer Spalte mit floatXX ist ein NumPy-Typ numpy.floatXX. Beide werden als fehlende Werte behandelt.
print(df.dtypes)
# name object
# age float64
# state object
# point float64
# other float64
# dtype: object
print(df.at[1, 'name'])
# nan
print(type(df.at[1, 'name']))
# <class 'float'>
print(df.at[1, 'age'])
# nan
print(type(df.at[1, 'age']))
# <class 'numpy.float64'>
Zusätzlich zum Lesen einer Datei WIRD nan used, um einen fehlenden Wert darzustellen, wenn das Element beim Aufrufen von Methoden wie reindex(), merge() usw. nicht vorhanden ist.
nan (keine Zahl) wird als fehlender Wert betrachtet
In Python können Sie nan mit float(’nan‘), math.nan oder np.nan erstellen. nan gilt als fehlender Wert bei Pandas.
s_nan = pd.Series([float('nan'), math.nan, np.nan])
print(s_nan)
# 0 NaN
# 1 NaN
# 2 NaN
# dtype: float64
print(s_nan.isnull())
# 0 True
# 1 True
# 2 True
# dtype: bool
Keiner wird auch als fehlender Wert betrachtet
Bei Pandas wird None auch als fehlender Wert behandelt. None ist eine eingebaute Konstante in Python.
print(None)
# None
print(type(None))
# <class 'NoneType'>
Bei numerischen Spalten wird „None“ in „nan“ konvertiert, wenn ein DataFrame oder eine Reihe mit „None“ erstellt oder einem Element „None“ zugewiesen wird.
s_none_float = pd.Series([None, 0.1, 0.2])
s_none_float[2] = None
print(s_none_float)
# 0 NaN
# 1 0.1
# 2 NaN
# dtype: float64
print(s_none_float.isnull())
# 0 True
# 1 False
# 2 True
# dtype: bool
Da nan eine Gleitkommazahl float ist, wird der Datentyp dtype der Spalte in float geändert, wenn None in nan converted WIRD, selbst wenn die anderen Werte Ganzzahlen int sind.
s_none_int = pd.Series([None, 1, 2])
print(s_none_int)
# 0 NaN
# 1 1.0
# 2 2.0
# dtype: float64
Obwohl None in der Objektspalte als None verbleibt, wird es von isnull() als fehlender Wert erkannt. Natürlich wird es auch von Methoden wie dropna() und fillna() gehandhabt.
s_none_object = pd.Series([None, 'abc', 'xyz'])
print(s_none_object)
# 0 None
# 1 abc
# 2 xyz
# dtype: object
print(s_none_object.isnull())
# 0 True
# 1 False
# 2 False
# dtype: bool
print(s_none_object.fillna(0))
# 0 0
# 1 abc
# 2 xyz
# dtype: object
String wird nicht als fehlender Wert betrachtet
Die Zeichenfolgen „NaN“ und „None“ sind in der Anzeige nicht zu unterscheiden, gelten jedoch nicht als fehlende Werte. Die leere Zeichenkette “ wird ebenfalls nicht als fehlender Wert behandelt.
s_str = pd.Series(['NaN', 'None', ''])
print(s_str)
# 0 NaN
# 1 None
# 2
# dtype: object
print(s_str.isnull())
# 0 False
# 1 False
# 2 False
# dtype: bool
Wenn Sie den Wert als fehlenden Wert behandeln möchten, können Sie ihn mit der Methode replace() durch float(’nan‘), np.nan und math.nan ersetzen.
s_replace = s_str.replace(['NaN', 'None', ''], float('nan'))
print(s_replace)
# 0 NaN
# 1 NaN
# 2 NaN
# dtype: float64
print(s_replace.isnull())
# 0 True
# 1 True
# 2 True
# dtype: bool
Beachten Sie, dass Funktionen zum Lesen von Dateien wie read_csv() “, ‚NaN‘, ’null‘ usw. standardmäßig als fehlende Werte betrachten und durch nan ersetzen.
Infinity inf wird standardmäßig nicht als fehlender Wert angesehen
Infinity inf wird standardmäßig nicht als fehlender Wert betrachtet.
s_inf = pd.Series([float('inf'), -float('inf')])
print(s_inf)
# 0 inf
# 1 -inf
# dtype: float64
print(s_inf.isnull())
# 0 False
# 1 False
# dtype: bool
Wenn pd.options.mode.use_inf_as_na auf True gesetzt ist, wird inf in pandas.DataFrame und Series in nan konvertiert und als fehlender Wert behandelt. Im Gegensatz zu None wird inf in der Objektspalte auch in nan konvertiert.
pd.options.mode.use_inf_as_na = True
print(s_inf)
# 0 NaN
# 1 NaN
# dtype: float64
print(s_inf.isnull())
# 0 True
# 1 True
# dtype: bool
s_inf_object = pd.Series([float('inf'), -float('inf'), 'abc'])
print(s_inf_object)
# 0 NaN
# 1 NaN
# 2 abc
# dtype: object
print(s_inf_object.isnull())
# 0 True
# 1 True
# 2 False
# dtype: bool
Im folgenden Artikel erfahren Sie, wie Sie Optionen in Pandas festlegen.
pd.NA ist der experimentelle Wert (ab 1.4.0)
pd.NA wurde als experimenteller NA-Skalar in pandas 1.0.0 eingeführt.
print(pd.NA)
#
print(type(pd.NA))
# <class 'pandas._libs.missing.NAType'>
Während nan == nan False ist, ist pd.NA == pd.NA pd.NA wie in der Sprache R.
print(float('nan') == float('nan'))
# False
print(pd.NA == pd.NA)
#
Natürlich wird pd.NA als fehlender Wert behandelt.
s_na = pd.Series([None, 1, 2], dtype='Int64')
print(s_na)
# 0
# 1 1
# 2 2
# dtype: Int64
print(s_na.isnull())
# 0 True
# 1 False
# 2 False
# dtype: bool
print(s_na.fillna(0))
# 0 0
# 1 1
# 2 2
# dtype: Int64
Siehe das folgende Dokument für Int64 im Beispielcode. Auch wenn es fehlende Werte enthält, werden andere ganzzahlige Werte nicht in Fließkommazahlen konvertiert.
Beachten Sie, dass es ab 1.4.0 (Februar 2022) immer noch „experimentell“ ist und sich sein Verhalten ändern kann.
Warnung
Experimentell: Das Verhalten von pd.NA kann sich immer noch ohne Vorwarnung ändern.
Arbeiten mit fehlenden Daten – Experimenteller NA-Skalar zur Bezeichnung fehlender Werte – Dokumentation zu Pandas 1.4.0