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 DataFrame
s 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.
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']
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?
Pandas
bietet für Series
und DataFrame
s die nützlichen Funktionen isna()
, notna()
, dropna()
und fillna()
an um fehlende Werte zu identifizieren, zu entfernen oder mit anderen Werten zu ersetzen.
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.
# drops all rows that contain at least one missing values
df.dropna()
# drops all missing values in this series
df['Age Range'].dropna()
df['Age Range'].fillna("keine Angabe")
Standardmäßig werden bei den Operationen fillna
oder dropna
neue Series
oder DataFrame
s zurückgegeben. Die originale Variable bleibt dabei unangetastet. Mit dem Argument inplace=True
werden die originalen Objekte direkt überschrieben.
DataFrame
der keine Beobachtungen mit fehlenden Werten mehr enthält.Library_Usage_Clean.csv
ab.