Risposte:
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 NaN
valore):
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 NaN
valore:
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
df.columns[df.isin['xxx'].any()].tolist()
df.columns[df.eq(search_for_value).any()].tolist()
isna
, notna
?
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
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.
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]
df.isna().any()[lambda x: x]
funziona per me