
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