Skip to content

Fehlende Werte in pandas (nan, None, pd.NA)

Python

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