Angenommen, ein Pandas-Datenrahmen enthält (möglicherweise) hier und dort verstreute NaN-Werte:
Frage: wie kann ich feststellen, welche Spalten NaN-Werte enthalten? Kann ich insbesondere eine Liste der Spaltennamen erhalten, die NaNs enthalten?
Vielen Dank
UPDATE: mit Pandas 0.22.0
Neuere Pandas-Versionen haben neue Methoden 'DataFrame.isna ()' und 'DataFrame.notna ()'
In [71]: df
Out[71]:
a b c
0 NaN 7.0 0
1 0.0 NaN 4
2 2.0 NaN 4
3 1.0 7.0 0
4 1.0 3.0 9
5 7.0 4.0 9
6 2.0 6.0 9
7 9.0 6.0 4
8 3.0 0.0 9
9 9.0 0.0 1
In [72]: df.isna().any()
Out[72]:
a True
b True
c False
dtype: bool
als Liste der Spalten:
In [74]: df.columns[df.isna().any()].tolist()
Out[74]: ['a', 'b']
um diese Spalten auszuwählen (die mindestens einen NaN
-Wert enthalten):
In [73]: df.loc[:, df.isna().any()]
Out[73]:
a b
0 NaN 7.0
1 0.0 NaN
2 2.0 NaN
3 1.0 7.0
4 1.0 3.0
5 7.0 4.0
6 2.0 6.0
7 9.0 6.0
8 3.0 0.0
9 9.0 0.0
ALTE Antwort:
Verwenden Sie isnull () :
In [97]: df
Out[97]:
a b c
0 NaN 7.0 0
1 0.0 NaN 4
2 2.0 NaN 4
3 1.0 7.0 0
4 1.0 3.0 9
5 7.0 4.0 9
6 2.0 6.0 9
7 9.0 6.0 4
8 3.0 0.0 9
9 9.0 0.0 1
In [98]: pd.isnull(df).sum() > 0
Out[98]:
a True
b True
c False
dtype: bool
oder als @root vorgeschlagene klarere Version:
In [5]: df.isnull().any()
Out[5]:
a True
b True
c False
dtype: bool
In [7]: df.columns[df.isnull().any()].tolist()
Out[7]: ['a', 'b']
eine Teilmenge auswählen - alle Spalten, die mindestens einen NaN
-Wert enthalten:
In [31]: df.loc[:, df.isnull().any()]
Out[31]:
a b
0 NaN 7.0
1 0.0 NaN
2 2.0 NaN
3 1.0 7.0
4 1.0 3.0
5 7.0 4.0
6 2.0 6.0
7 9.0 6.0
8 3.0 0.0
9 9.0 0.0
Sie können df.isnull().sum()
verwenden. Es zeigt alle Spalten und die gesamten NaNs jedes Features.
Ich hatte ein Problem, bei dem ich zu viele Spalten hatte, um sie auf dem Bildschirm visuell zu untersuchen, so dass eine kurze Liste comp, die die störenden Spalten filtert und zurückgibt, ist
nan_cols = [i for i in df.columns if df[i].isnull().any()]
wenn das für jemanden hilfreich ist
Beides sollte funktionieren:
df.isnull().sum()
df.isna().sum()
DataFrame-Methoden isna()
oder isnull()
sind vollständig identisch.
Hinweis : Leere Zeichenfolgen ''
wird als False (nicht als NA) betrachtet
ich verwende diese drei Codezeilen, um die Spaltennamen auszudrucken, die mindestens einen Nullwert enthalten:
for column in dataframe:
if dataframe[column].isnull().any():
print('{0} has {1} null values'.format(column, dataframe[column].isnull().sum()))