Skip to content

pandas: Ersetzen fehlender Werte (NaN) mit fillna()

Python

Sie können den fehlenden Wert (NaN) in pandas.DataFrame und Series mithilfe der Methode fillna() durch einen beliebigen Wert ersetzen.

Dieser Artikel hat folgenden Inhalt.

  • Ersetzen Sie alle fehlenden Werte durch Wert
  • Ersetzen Sie fehlende Werte durch andere Werte für jede Spalte
  • Ersetzen Sie fehlende Werte für jede Spalte durch Mittelwert, Median, Modus usw
  • Fehlende Werte durch vorherige/nächste gültige Werte ersetzen:method, limit
  • An Ort und Stelle operieren:inplace
  • Für Pandas.Serie

Verwenden Sie interpolate(), wenn Sie fehlende Werte mit linearer oder Spline-Interpolation füllen möchten.

Weitere Informationen zum Entfernen oder Zählen fehlender Werte finden Sie in den following Artikeln.

Beachten Sie, dass nicht nur NaN (Not a Number), sondern auch None als fehlender Wert in Pandas behandelt wird.

Lesen Sie als Beispiel eine CSV-Datei mit fehlenden Werten mit read_csv().

import pandas as pd

df = pd.read_csv('data/src/sample_pandas_normal_nan.csv')
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
# 3     Dave  68.0    TX   70.0    NaN
# 4    Ellen   NaN    CA   88.0    NaN
# 5    Frank  30.0   NaN    NaN    NaN

Ersetzen Sie alle fehlenden Werte durch Wert

Durch die Angabe des Skalarwerts als erster Argumentwert von fillna() werden alle fehlenden Werte durch den ersetzten Wert.

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
# 3     Dave  68.0    TX   70.0    0.0
# 4    Ellen   0.0    CA   88.0    0.0
# 5    Frank  30.0     0    0.0    0.0

Beachten Sie, dass der Datentyp einer Spalte mit Zahlen einschließlich NaN Float ist. Selbst wenn Sie auch NaN durch eine Ganzzahl ersetzen, bleibt der Datentyp Float. Wenn Sie es in int konvertieren möchten, verwenden Sie astype().

Ersetzen Sie fehlende Werte durch andere Werte für jede Spalte

Indem SIE ein Wörterbuch-Diktat als ersten Argumentwert von fillna() angeben, can SIE JEDER Spalte unterschiedliche Werte zuweisen.

Geben Sie ein Wörterbuch von {column_name: value} an. If ein Spaltenname nicht angegeben WIRD, Werden fehlende Werte in seiner Spalte (= nicht ersetzt). Wenn der Schlüssel nicht mit einem Spaltennamen gefunden wird, wird er ignoriert.

print(df.fillna({'name': 'XXX', 'age': 20, 'ZZZ': 100}))
#       name   age state  point  other
# 0    Alice  24.0    NY    NaN    NaN
# 1      XXX  20.0   NaN    NaN    NaN
# 2  Charlie  20.0    CA    NaN    NaN
# 3     Dave  68.0    TX   70.0    NaN
# 4    Ellen  20.0    CA   88.0    NaN
# 5    Frank  30.0   NaN    NaN    NaN

Sie können auch pandas.Serie angeben. Die Labels von pandas.Series entsprechen dem Schlüssel von dict.

s_for_fill = pd.Series(['XXX', 20, 100], index=['name', 'age', 'ZZZ'])
print(s_for_fill)
# name    XXX
# age      20
# ZZZ     100
# dtype: object

print(df.fillna(s_for_fill))
#       name   age state  point  other
# 0    Alice  24.0    NY    NaN    NaN
# 1      XXX  20.0   NaN    NaN    NaN
# 2  Charlie  20.0    CA    NaN    NaN
# 3     Dave  68.0    TX   70.0    NaN
# 4    Ellen  20.0    CA   88.0    NaN
# 5    Frank  30.0   NaN    NaN    NaN

Der Mittelwert jeder Spalte kann mit der mean()-Methode berechnet werden. pandas.Serie wird zurückgegeben. NaN wird ausgeschlossen, aber das Ergebnis für eine Spalte, in der alle Elemente NaN sind, ist NaN.

print(df.mean())
# age      40.666667
# point    79.000000
# other          NaN
# dtype: float64

Wenn Sie diese pandas.Series als Ersten Argumentwert von fillna() angeben, Werden fehlende Werte der entsprechenden Spalte durch den Mittelwert ersetzt.

print(df.fillna(df.mean()))
#       name        age state  point  other
# 0    Alice  24.000000    NY   79.0    NaN
# 1      NaN  40.666667   NaN   79.0    NaN
# 2  Charlie  40.666667    CA   79.0    NaN
# 3     Dave  68.000000    TX   70.0    NaN
# 4    Ellen  40.666667    CA   88.0    NaN
# 5    Frank  30.000000   NaN   79.0    NaN

Wenn SIE fehlende Werte durch den Median ersetzen möchten, verwenden SIE die Methode median(). Wenn die Anzahl der Elemente gerade ist, wird der Durchschnitt der beiden Medianwerte zurückgegeben.

print(df.fillna(df.median()))
#       name   age state  point  other
# 0    Alice  24.0    NY   79.0    NaN
# 1      NaN  30.0   NaN   79.0    NaN
# 2  Charlie  30.0    CA   79.0    NaN
# 3     Dave  68.0    TX   70.0    NaN
# 4    Ellen  30.0    CA   88.0    NaN
# 5    Frank  30.0   NaN   79.0    NaN

Der Modus kann mit der Methode mode() ermittelt werden. Da mode() pandas.DataFrame zurückgibt, wird die erste Zeile in diesem Beispiel als pandas.Series von iloc[0] abgerufen.

print(df.fillna(df.mode().iloc[0]))
#       name   age state  point  other
# 0    Alice  24.0    NY   70.0    NaN
# 1    Alice  24.0    CA   70.0    NaN
# 2  Charlie  24.0    CA   70.0    NaN
# 3     Dave  68.0    TX   70.0    NaN
# 4    Ellen  24.0    CA   88.0    NaN
# 5    Frank  30.0    CA   70.0    NaN

In diesen Beispielen gibt es kein Problem, aber Methoden wie mean() can unerwartete Werte zurückgeben, da sie versuchen, nicht nur numerische Spalten, sondern auch standardmäßig andere Spaltentypen zu verarbeiten.

Wenn in mean() usw. Das Argument numeric_only auf True gesetzt IST, werden nur numerische Spalten verarbeitet. Beachten Sie, dass Spalten vom Typ bool als True=1 und False=0 behandelt werden, selbst wenn numeric_only=True.

Fehlende Werte durch vorherige/nächste gültige Werte ersetzen:method, limit

Das Methodenargument von fillna() can used Werden, um fehlende Werte durch vorherige/nächste gültige Werte zu ersetzen.

If Methode auf ‚ffill‘ oder ‚pad‘ gesetzt IST, Werden fehlende Werte durch vorherige gültige Werte ersetzt (= Forward Fill), und wenn ‚bfill‘ oder ‚backfill‘, durch sterben gültige Werte (= Backfill).

print(df.fillna(method='ffill'))
#       name   age state  point  other
# 0    Alice  24.0    NY    NaN    NaN
# 1    Alice  24.0    NY    NaN    NaN
# 2  Charlie  24.0    CA    NaN    NaN
# 3     Dave  68.0    TX   70.0    NaN
# 4    Ellen  68.0    CA   88.0    NaN
# 5    Frank  30.0    CA   88.0    NaN

print(df.fillna(method='bfill'))
#       name   age state  point  other
# 0    Alice  24.0    NY   70.0    NaN
# 1  Charlie  68.0    CA   70.0    NaN
# 2  Charlie  68.0    CA   70.0    NaN
# 3     Dave  68.0    TX   70.0    NaN
# 4    Ellen  30.0    CA   88.0    NaN
# 5    Frank  30.0   NaN    NaN    NaN

If method is, can limit used Werden, um die maximale Anzahl auf vorangestellter Ersetzungen anzugeben.

print(df.fillna(method='ffill', limit=1))
#       name   age state  point  other
# 0    Alice  24.0    NY    NaN    NaN
# 1    Alice  24.0    NY    NaN    NaN
# 2  Charlie   NaN    CA    NaN    NaN
# 3     Dave  68.0    TX   70.0    NaN
# 4    Ellen  68.0    CA   88.0    NaN
# 5    Frank  30.0    CA   88.0    NaN

print(df.fillna(method='bfill', limit=1))
#       name   age state  point  other
# 0    Alice  24.0    NY    NaN    NaN
# 1  Charlie   NaN    CA    NaN    NaN
# 2  Charlie  68.0    CA   70.0    NaN
# 3     Dave  68.0    TX   70.0    NaN
# 4    Ellen  30.0    CA   88.0    NaN
# 5    Frank  30.0   NaN    NaN    NaN

Es wird möglicherweise nicht oft verwendet, aber wenn das Achsenargument auf 1 oder „Spalten“ ersetzt ist, werden fehlende Werte durch die linken und rechten Werte.

print(df.fillna(method='ffill', axis=1))
#       name      age state point other
# 0    Alice     24.0    NY    NY    NY
# 1      NaN      NaN   NaN   NaN   NaN
# 2  Charlie  Charlie    CA    CA    CA
# 3     Dave     68.0    TX  70.0  70.0
# 4    Ellen    Ellen    CA  88.0  88.0
# 5    Frank     30.0  30.0  30.0  30.0

print(df.fillna(method='bfill', axis=1))
#       name   age state point other
# 0    Alice  24.0    NY   NaN   NaN
# 1      NaN   NaN   NaN   NaN   NaN
# 2  Charlie    CA    CA   NaN   NaN
# 3     Dave  68.0    TX  70.0   NaN
# 4    Ellen    CA    CA  88.0   NaN
# 5    Frank  30.0   NaN   NaN   NaN

Methoden, die dem Methodenargument entsprechen, werden separat bereitgestellt.

ffill() und pad() sind äquivalent zu fillna(method=’ffill‘) und bfill() und backfill() sind äquivalent zu fillna(method=’bfill‘). Sie können eine Grenze festlegen.

print(df.ffill())
#       name   age state  point  other
# 0    Alice  24.0    NY    NaN    NaN
# 1    Alice  24.0    NY    NaN    NaN
# 2  Charlie  24.0    CA    NaN    NaN
# 3     Dave  68.0    TX   70.0    NaN
# 4    Ellen  68.0    CA   88.0    NaN
# 5    Frank  30.0    CA   88.0    NaN

print(df.bfill(limit=1))
#       name   age state  point  other
# 0    Alice  24.0    NY    NaN    NaN
# 1  Charlie   NaN    CA    NaN    NaN
# 2  Charlie  68.0    CA   70.0    NaN
# 3     Dave  68.0    TX   70.0    NaN
# 4    Ellen  30.0    CA   88.0    NaN
# 5    Frank  30.0   NaN    NaN    NaN

An Ort und Stelle operieren:inplace

Wie in den Beispielen gezeigt, wird standardmäßig ein neues Objekt zurückgesetzt, und das ursprüngliche Objekt wird nicht geändert, aber wenn inplace=True, wird das ursprüngliche Objekt selbst aktualisiert.

df.fillna(0, inplace=True)
print(df)
#       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
# 3     Dave  68.0    TX   70.0    0.0
# 4    Ellen   0.0    CA   88.0    0.0
# 5    Frank  30.0     0    0.0    0.0

Für Pandas.Serie

Sie können auch fillna() von pandas.Series wie in den vorherigen Beispielen von pandas.DataFrame verwenden.

s = pd.read_csv('data/src/sample_pandas_normal_nan.csv')['age']
print(s)
# 0    24.0
# 1     NaN
# 2     NaN
# 3    68.0
# 4     NaN
# 5    30.0
# Name: age, dtype: float64

print(s.fillna(100))
# 0     24.0
# 1    100.0
# 2    100.0
# 3     68.0
# 4    100.0
# 5     30.0
# Name: age, dtype: float64

print(s.fillna({1: 100, 4: -100}))
# 0     24.0
# 1    100.0
# 2      NaN
# 3     68.0
# 4   -100.0
# 5     30.0
# Name: age, dtype: float64

print(s.fillna(method='bfill', limit=1))
# 0    24.0
# 1     NaN
# 2    68.0
# 3    68.0
# 4    30.0
# 5    30.0
# Name: age, dtype: float64

Methoden, die dem Methodenargument entsprechen, werden ebenfalls bereitgestellt.

print(s.bfill(limit=1))
# 0    24.0
# 1     NaN
# 2    68.0
# 3    68.0
# 4    30.0
# 5    30.0
# Name: age, dtype: float64