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?


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

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.


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


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.


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()))

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


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]

Vielen Dank für die vielfältigen Ansätze!
Mike Rapadas
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.