Come trovare quali colonne contengono qualsiasi valore NaN nel frame di dati Pandas


144

Dato un frame di dati panda contenente possibili valori NaN sparsi qua e là:

Domanda: come determinare quali colonne contengono valori NaN? In particolare, posso ottenere un elenco dei nomi delle colonne che contengono NaN?


5
df.isna().any()[lambda x: x]funziona per me
matanster

Risposte:


249

AGGIORNAMENTO: utilizzando Panda 0.22.0

Le versioni Pandas più recenti hanno nuovi metodi 'DataFrame.isna ()' e '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

come elenco di colonne:

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

per selezionare quelle colonne (contenenti almeno un NaNvalore):

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

VECCHIA risposta:

Prova a usare 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

o come @root ha proposto la versione più chiara:

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

per selezionare un sottoinsieme - tutte le colonne contenenti almeno un NaNvalore:

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

Grazie per la risposta! Sto cercando di ottenere un elenco dei nomi delle colonne (ho aggiornato la mia domanda di conseguenza), sai come?
Denvar,

Conosci un buon modo per selezionare tutte le colonne con un valore specifico anziché valori null?
Gregorio

1
Non importa! Sostituisci semplicemente .isnull () con .isin (['xxx']) per cercare valori anziché valori nulli:df.columns[df.isin['xxx'].any()].tolist()
gregorio099

@Gregorio099, lo farei in questo modo:df.columns[df.eq(search_for_value).any()].tolist()
MaxU

1
Bella risposta, già votata. Idea - si può aggiungere nuove funzioni isna, notna ?
jezrael,

26

È possibile utilizzare df.isnull().sum(). Mostra tutte le colonne e il NaN totale di ogni funzione.


9

Ho avuto un problema in cui ho dovuto ispezionare visivamente molte colonne sullo schermo, quindi un breve elenco comp che filtra e restituisce le colonne offensive è

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

se questo è utile a nessuno


4

Nei set di dati con un numero elevato di colonne è ancora meglio vedere quante colonne contengono valori null e quante no.

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

Ad esempio nel mio frame di dati conteneva 82 colonne, di cui 19 contenevano almeno un valore null.

Inoltre puoi anche rimuovere automaticamente i col e le righe a seconda di quale ha più valori null
Ecco il codice che lo fa in modo intelligente:

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

Nota: sopra il codice rimuove tutti i valori null. Se desideri valori null, elaborali prima.


2

io uso queste tre righe di codice per stampare i nomi delle colonne che contengono almeno un valore null:

for column in dataframe:
    if dataframe[column].isnull().any():
       print('{0} has {1} null values'.format(column, dataframe[column].isnull().sum()))

2

Entrambi dovrebbero funzionare:

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

I metodi DataFrame isna()o isnull()sono completamente identici.

Nota : le stringhe vuote ''sono considerate false (non considerate NA)


1

Questo ha funzionato per me,

1. Per ottenere colonne con almeno 1 valore null. (nomi di colonna)

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

2. Per ottenere colonne con conteggio, con almeno 1 valore null.

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

[Opzionale] 3. Per ottenere la percentuale del conteggio null.

data[data.columns[data.isnull().any()]].isnull().sum() * 100 / data.shape[0]

Grazie per gli approcci multipli!
Mike Rapadas,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.