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.
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 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.
# 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.