Exkurs: Fehlende Werte

Real erhobene Daten sind meistens unsauber und fehlerhaft. Ein häufiges Problem dabei sind fehlende Werte, also Beobachtungen für die manche Merkmale nicht erhoben wurden. In jedem Datensatz werden fehlende Werte anders gekennzeichnet, aber man findet oft diese Kodierungen wieder: "-999", "NA", " ", "None", "NULL", "#N/A".

Wenn beispielsweise der Mittelwert einer statistischen Variable berechnet wird, so muss entschieden werden, wie mit fehlenden Werten umgegangen werden soll: Sollen die Werte entfernt werden? Sollen die fehlenden Werte durch einen bestimmten Wert ersetzt werden?

In DataFrames werden fehlende Werte durch das Schlüsselwort NaN ("Not a Number") angezeigt. Beim Einlesen von Daten (siehe z.B. die read_csv Funktion) können mit dem Argument na_values zusätzliche Kodierungen für fehlerhafte Werte mit angegeben werden.

2.7 Datentypen (1 Minute)

Was unterscheidet den Wert None vom Wert "None"? Was den Wert 5 vom Wert "5"? Was den Wert "NaN" vom Wert NaN? Ist True und "True" das gleiche?

Behandlung von Fehlenden Werten

Pandas bietet für Series und DataFrames die nützlichen Funktionen isna(), notna(), dropna() und fillna() an um fehlende Werte zu identifizieren, zu entfernen oder mit anderen Werten zu ersetzen.

Filter

Die Funktionen isna (notna) geben eine boolesche Series zurück, die True (False) ist, wenn an der Stelle ein fehlender Wert steht. Damit pandas fehlende Werte korrekt erkennt, müssen diese vorher erst in das interne Format NaN umgewandelt werden (siehe oben).

df[df['Age Range'].isna()]
df[df['Age Range'].notna()]

Mit diesem nützlichen Befehl kannst Du Dir schnell die Anzahl fehlender Werte in jeder Spalte ausgeben lassen:

df.isna().sum()

Dies funktioniert, da Python bei Bedarf einen booleschen Wert implizit in ein numerisches Format konvertiert. True wird zu 1 konvertiert und False zu 0.

Entfernen

# drops all rows that contain at least one missing values
df.dropna()
# drops all missing values in this series
df['Age Range'].dropna()

Ersetzen

df['Age Range'].fillna("keine Angabe")

Standardmäßig werden bei den Operationen fillna oder dropna neue Series oder DataFrames zurückgegeben. Die originale Variable bleibt dabei unangetastet. Mit dem Argument inplace=True werden die originalen Objekte direkt überschrieben.

2.8 Exkurs: Fehlende Werte (20 Min)

  • Welche Spalten enthalten alles fehlende Werte?
  • Lies den Datensatz ein und erstelle einen DataFrame der keine Beobachtungen mit fehlenden Werten mehr enthält.
  • Speichere diesen unter dem Namen Library_Usage_Clean.csv ab.
  • Wie viele Beobachtungen wurden dabei entfernt?