Jak znaleźć kolumny zawierające dowolną wartość NaN w ramce danych Pandas

144

Biorąc pod uwagę ramkę danych pandy zawierającą możliwe wartości NaN rozproszone tu i tam:

Pytanie: Jak określić, które kolumny zawierają wartości NaN? W szczególności, czy mogę uzyskać listę nazw kolumn zawierających NaN?

denvar
źródło
5
df.isna().any()[lambda x: x]działa dla mnie
matanster

Odpowiedzi:

249

UPDATE: używając Pandas 0.22.0

Nowsze wersje Pandy mają nowe metody „DataFrame.isna ()” i „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

jako lista kolumn:

In [74]: df.columns[df.isna().any()].tolist()
Out[74]: ['a', 'b']

aby wybrać te kolumny (zawierające co najmniej jedną NaNwartość):

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

STARA odpowiedź:

Spróbuj użyć 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

lub jak @root zaproponował jaśniejszą wersję:

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

aby wybrać podzbiór - wszystkie kolumny zawierające co najmniej jedną NaNwartość:

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
źródło
Dzięki za odpowiedzi! Chcę uzyskać listę nazw kolumn (odpowiednio zaktualizowałem moje pytanie), czy wiesz jak?
denvar
Czy znasz dobry sposób na wybranie wszystkich kolumn z określoną wartością zamiast wartości null?
gregorio099
1
Nieważne! Po prostu zamień .isnull () na .isin (['xxx']), aby wyszukać wartości zamiast wartości null:df.columns[df.isin['xxx'].any()].tolist()
gregorio099
@ gregorio099, zrobiłbym to w ten sposób:df.columns[df.eq(search_for_value).any()].tolist()
MaxU
1
Dobra odpowiedź, już przegłosowana. Pomysł - można dodać nowe funkcje isna, notna ?
jezrael
26

Możesz użyć df.isnull().sum(). Pokazuje wszystkie kolumny i łączną wartość NaN każdej funkcji.

Matheus
źródło
8

Miałem problem polegający na tym, że miałem za dużo kolumn do wizualnej inspekcji na ekranie, więc krótka lista comp, która filtruje i zwraca naruszające kolumny to

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

jeśli to komuś pomoże

Tom Wattley
źródło
4

W zestawach danych zawierających dużą liczbę kolumn jeszcze lepiej jest sprawdzić, ile kolumn zawiera wartości null, a ile nie.

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

Na przykład w mojej ramce danych zawierała 82 kolumny, z których 19 zawierało co najmniej jedną wartość null.

Ponadto możesz również automatycznie usuwać kolumny i wiersze w zależności od tego, która ma więcej wartości null.
Oto kod, który robi to inteligentnie:

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

Uwaga: powyższy kod usuwa wszystkie wartości null. Jeśli chcesz mieć wartości null, przetwórz je wcześniej.

Pradeep Singh
źródło
2

Używam tych trzech wierszy kodu, aby wydrukować nazwy kolumn, które zawierają co najmniej jedną wartość null:

for column in dataframe:
    if dataframe[column].isnull().any():
       print('{0} has {1} null values'.format(column, dataframe[column].isnull().sum()))
Szczery
źródło
2

Oba powinny działać:

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

DataFrame isna()lub isnull()są całkowicie identyczne.

Uwaga : puste ciągi ''są uważane za fałszywe (nie uważane za NA)

prosti
źródło
1

To zadziałało dla mnie,

1. Aby uzyskać kolumny mające co najmniej 1 wartość null. (nazwy kolumn)

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

2. Aby uzyskać kolumny z liczbą, z co najmniej 1 wartością zerową.

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

[Opcjonalnie] 3. Aby uzyskać procent wartości zerowej.

data[data.columns[data.isnull().any()]].isnull().sum() * 100 / data.shape[0]
Uday Kiran
źródło
Dzięki za wielokrotne podejście!
Mike Rapadas