So finden Sie heraus, welche Spalten einen NaN-Wert im Pandas-Datenrahmen enthalten

144

Bei einem Pandas-Datenrahmen, der mögliche NaN-Werte enthält, die hier und da verstreut sind:

Frage: Wie bestimme ich, welche Spalten NaN-Werte enthalten? Kann ich insbesondere eine Liste der Spaltennamen erhalten, die NaNs enthalten?

denvar
quelle
5
df.isna().any()[lambda x: x]arbeitet für mich
Matanster

Antworten:

249

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 NaNWert 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:

Versuchen Sie, isnull () zu verwenden :

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 von @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']

So wählen Sie eine Teilmenge aus - alle Spalten, die mindestens einen NaNWert 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
MaxU
quelle
Danke für die Antwort! Ich suche nach einer Liste der Spaltennamen (ich habe meine Frage entsprechend aktualisiert). Wissen Sie wie?
Denvar
Kennen Sie eine gute Möglichkeit, alle Spalten mit einem bestimmten Wert anstelle von Nullwerten auszuwählen?
Gregorio099
1
Keine Ursache! Ersetzen Sie einfach .isnull () durch .isin (['xxx']), um nach Werten anstelle von Nullen zu suchen:df.columns[df.isin['xxx'].any()].tolist()
gregorio099
@ Gregorio099, ich würde es so machen:df.columns[df.eq(search_for_value).any()].tolist()
MaxU
1
Schöne Antwort, bereits positiv bewertet. Idee - können Sie neue Funktionen hinzufügen isna, notna ?
Jezrael
26

Sie können verwenden df.isnull().sum(). Es zeigt alle Spalten und die gesamten NaNs jedes Features.

Matheus
quelle
8

Ich hatte ein Problem, bei dem ich zu viele Spalten hatte, um sie auf dem Bildschirm visuell zu überprüfen, sodass eine kurze Liste erstellt wurde, die die fehlerhaften Spalten filtert und zurückgibt

nan_cols = [i for i in df.columns if df[i].isnull().any()]

wenn das für jemanden hilfreich ist

Tom Wattley
quelle
4

In Datasets mit einer großen Anzahl von Spalten ist es noch besser zu sehen, wie viele Spalten Nullwerte enthalten und wie viele nicht.

print("No. of columns containing null values")
print(len(df.columns[df.isna().any()]))

print("No. of columns not containing null values")
print(len(df.columns[df.notna().all()]))

print("Total no. of columns in the dataframe")
print(len(df.columns))

Zum Beispiel enthielt es in meinem Datenrahmen 82 Spalten, von denen 19 mindestens einen Nullwert enthielten.

Außerdem können Sie Spalten und Zeilen automatisch entfernen, je nachdem, welche mehr Nullwerte haben.
Hier ist der Code, der dies intelligent macht:

df = df.drop(df.columns[df.isna().sum()>len(df.columns)],axis = 1)
df = df.dropna(axis = 0).reset_index(drop=True)

Hinweis: Der obige Code entfernt alle Ihre Nullwerte. Wenn Sie Nullwerte möchten, verarbeiten Sie diese zuvor.

Pradeep Singh
quelle
2

Ich benutze 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()))
Frank
quelle
2

Beides sollte funktionieren:

df.isnull().sum()
df.isna().sum()

DataFrame-Methoden isna()oder isnull()sind völlig identisch.

Hinweis : Leere Zeichenfolgen ''gelten als falsch (nicht als NA betrachtet).

Prosti
quelle
1

Das hat bei mir funktioniert,

1. Zum Abrufen von Spalten mit mindestens 1 Nullwert. (Spaltennamen)

data.columns[data.isnull().any()]

2. Zum Abrufen von Spalten mit Anzahl mit mindestens 1 Nullwert.

data[data.columns[data.isnull().any()]].isnull().sum()

[Optional] 3. Zum Abrufen des Prozentsatzes der Nullanzahl.

data[data.columns[data.isnull().any()]].isnull().sum() * 100 / data.shape[0]
Uday Kiran
quelle
Vielen Dank für die vielfältigen Ansätze!
Mike Rapadas