Skip to content

pandas: Fehlende Werte (NaN) mit dropna() entfernen

Python

Sie können fehlende Werte (NaN) aus pandas.DataFrame, Series mit dropna() entfernen.

Dieser Artikel hat folgenden Inhalt.

  • Zeilen/Spalten entfernen, in denen allen Elementen Werte fehlen:how='all'
  • Zeilen/Spalten entfernen, die mindestens einen fehlenden Wert enthalten:how='any' (default)
  • Zeilen/Spalten entsprechend der Anzahl der nicht fehlenden Werte entfernen:thresh
  • Statistisch auf bestimmte Zeilen/Spalten entfernen:subset
  • An Ort und Stelle operieren:inplace
  • Für Pandas.Serie

Wenn SIE Zeilen und Spalten mit fehlenden Werten extrahieren möchten, lesen Sie den following Artikel.

Informationen zum Ersetzen und 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

Zeilen/Spalten entfernen, in denen allen Elementen Werte fehlen:how='all'

Durch Setzen von how=’all‘ Werden Zeilen entfernt, in denen allen Elementen Werte fehlen.

print(df.dropna(how='all'))
#       name   age state  point  other
# 0    Alice  24.0    NY    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

If die Achse auf 1 oder „Spalten“ eingestellt IST, Werden Spalten entfernt, in denen für alle Elemente Werte fehlen.

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

Beachten Sie, dass Zeilen entfernt werden, wenn die Achse auf 0 oder „Index“ gesetzt ist. Da der Standardwert von Achse 0 ist, Werden Zeilen entfernt, wenn sie weggelassen Werden, wie im ersten Beispiel gezeigt.

In verschiedenen Versionen wurden sowohl Zeilen als auch Spalten mit Achse = [0, 1] entfernt, aber seit Version 1.0.0 kann die Achse nicht mehr mit einer Liste oder einem Tupel angegeben werden.

Wenn Sie sowohl Zeilen als auch Spalten entfernen möchten, können Sie dropna() wiederholt anwenden.

# print(df.dropna(how='all', axis=[0, 1]))
# TypeError: supplying multiple axes to axis is no longer supported.

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

Zeilen/Spalten entfernen, die mindestens einen fehlenden Wert enthalten:how='any' (default)

Entfernen Sie als Beispiel Zeilen und Spalten, in denen alle Werte fehlende Werte sind.

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

Durch Setzen von how=’any‘ Werden Zeilen entfernt, sterben mindestens einen fehlenden Wert enthalten. Da der Standardwert von how ‚any‘ ist, ist das Ergebnis dasselbe, auch wenn es weggelassen WIRD.

print(df2.dropna(how='any'))
#    name   age state  point
# 3  Dave  68.0    TX   70.0

print(df2.dropna())
#    name   age state  point
# 3  Dave  68.0    TX   70.0

If die Achse auf 1 oder „Spalten“ gesetzt IST, Werden Spalten entfernt, sterben mindestens einen fehlenden Wert enthalten.

print(df2.dropna(axis=1))
#       name
# 0    Alice
# 2  Charlie
# 3     Dave
# 4    Ellen
# 5    Frank

Zeilen/Spalten entsprechend der Anzahl der nicht fehlenden Werte entfernen:thresh

Mit dem Argument thresh can SIE Zeilen und Spalten entsprechend der Anzahl nicht fehlender Werte entfernen.

If beispielsweise thresh=3, bleiben die Zeilen, die mehr als drei nicht fehlende Werte enthalten, übrig, und die anderen Zeilen werden entfernt.

print(df.dropna(thresh=3))
#     name   age state  point  other
# 0  Alice  24.0    NY    NaN    NaN
# 3   Dave  68.0    TX   70.0    NaN
# 4  Ellen   NaN    CA   88.0    NaN

If Achse auf 1 oder ‚Spalten‘ gesetzt IST, Werden Spalten entfernt.

print(df.dropna(thresh=3, axis=1))
#       name   age state
# 0    Alice  24.0    NY
# 1      NaN   NaN   NaN
# 2  Charlie   NaN    CA
# 3     Dave  68.0    TX
# 4    Ellen   NaN    CA
# 5    Frank  30.0   NaN

Statistisch auf bestimmte Zeilen/Spalten entfernen:subset

Wenn SIE basierend auf bestimmten Zeilen und Spalten entfernen möchten, geben Sie eine Liste von Zeilen-/Spaltenbeschriftungen (Namen) für das Subset-Argument von dropna() an. Auch wenn SIE nur ein Label festlegen möchten, müssen SIE es als Liste angeben, z. B. subset=[’name‘].

Da der Standardwert how=’any‘ und axis=0 ist, werden Zeilen mit fehlenden Werten in den durch subset angegebenen Spalten entfernt.

print(df.dropna(subset=['age']))
#     name   age state  point  other
# 0  Alice  24.0    NY    NaN    NaN
# 3   Dave  68.0    TX   70.0    NaN
# 5  Frank  30.0   NaN    NaN    NaN

print(df.dropna(subset=['age', 'state']))
#     name   age state  point  other
# 0  Alice  24.0    NY    NaN    NaN
# 3   Dave  68.0    TX   70.0    NaN

If how auf ‚all‘ gesetzt IST, Werden Zeilen mit fehlenden Werten in allen angegebenen Spalten entfernt.

print(df.dropna(subset=['age', 'state'], how='all'))
#       name   age state  point  other
# 0    Alice  24.0    NY    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

If Achse auf 1 oder ‚Spalten‘ gesetzt IST, Werden Spalten entfernt.

print(df.dropna(subset=[0, 4], axis=1))
#       name state
# 0    Alice    NY
# 1      NaN   NaN
# 2  Charlie    CA
# 3     Dave    TX
# 4    Ellen    CA
# 5    Frank   NaN

print(df.dropna(subset=[0, 4], axis=1, how='all'))
#       name   age state  point
# 0    Alice  24.0    NY    NaN
# 1      NaN   NaN   NaN    NaN
# 2  Charlie   NaN    CA    NaN
# 3     Dave  68.0    TX   70.0
# 4    Ellen   NaN    CA   88.0
# 5    Frank  30.0   NaN    NaN

Ein Fehler wird ausgelöst, wenn ein nicht vorhandener Zeilen- oder Spaltenname angegeben wird. Ein Fehler wird auch ausgelöst, wenn Sie Achse=1 setzen, aber Spaltennamen angeben oder Achse=0 (Standard) setzen, aber Zeilennamen angeben.

# print(df.dropna(subset=['age', 'state', 'xxx']))
# KeyError: ['xxx']

# print(df.dropna(subset=['age', 'state'], axis=1))
# KeyError: ['age', 'state']

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.dropna(subset=['age'], inplace=True)
print(df)
#     name   age state  point  other
# 0  Alice  24.0    NY    NaN    NaN
# 3   Dave  68.0    TX   70.0    NaN
# 5  Frank  30.0   NaN    NaN    NaN

Für Pandas.Serie

Das einzige gültige Argument für dropna() von pandas.Series ist vorhanden. Da es sich um eindimensionale Daten handelt, werden die Elemente mit fehlenden Werten einfach entfernt.

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.dropna())
# 0    24.0
# 3    68.0
# 5    30.0
# Name: age, dtype: float64

s.dropna(inplace=True)
print(s)
# 0    24.0
# 3    68.0
# 5    30.0
# Name: age, dtype: float64