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.

Fallbeispiel

Der Library Usage Datensatz enthält die Kodierung "None" für fehlende Werte. Diese werden von pandas beim Einlesen von numerischen Spalten nicht richtig erkannt:

import pandas as pd

df = pd.read_csv("../data/Library_Usage.csv")
df['Circulation Active Year']

Obwohl die Spalte 'Circulation Active Year' numerisch ist, wird Sie von pandas als Text abgespeichert, da "None" nicht als Zahl erkannt wird. Möchten Sie z.B. 2019 - df['Circulation Active Year'] berechnen, so werden Sie eine Fehlermeldung erhalten, da für Text-Werte keine Substraktionen durchgeführt werden können.

Um das Problem zu beheben können Sie auf zwei Arten vorgehen. Sie können schon beim Einlesen, die Kodierung für fehlende Werte mit angeben:

df = pd.read_csv("../data/Library_Usage.csv", na_values="None")
df['Circulation Active Year']

Oder Sie führen nach dem Einlesen eine explizite Umwandlung des Datentyps durch:

df = pd.read_csv("../data/Library_Usage.csv", na_values="None")
df['Circulation Active Year'] = pd.to_numeric(df['Circulation Active Year'], errors='coerce')
df['Circulation Active Year']

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 können Sie sich 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.

Exkurs: Fehlende Werte (20 Min)

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