web-dev-qa-db-fra.com

Comment trouver les colonnes contenant une valeur NaN dans le cadre de données Pandas (python)

Avec une base de données de pandas contenant (peut-être) des valeurs de NaN dispersées ici et là:

Question: comment puis-je déterminer quelles colonnes contiennent des valeurs NaN? En particulier, puis-je obtenir une liste des noms de colonnes contenant des NaN?

Je vous remercie

74
denvar

UPDATE: en utilisant Pandas 0.22.0

Les nouvelles versions de Pandas ont de nouvelles méthodes 'DataFrame.isna ()' et '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

sous forme de liste de colonnes:

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

pour sélectionner ces colonnes (contenant au moins une valeur NaN):

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

ANCIENNE réponse:

Essayez d'utiliser 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

ou comme @root a proposé une version plus claire:

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

pour sélectionner un sous-ensemble - toutes les colonnes contenant au moins une valeur NaN:

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
142
MaxU

Vous pouvez utiliser df.isnull().sum(). Il affiche toutes les colonnes et le total NaN de chaque entité.

14
Matheus

J'ai eu un problème où je devais avoir plusieurs colonnes à inspecter visuellement à l'écran, donc une liste restreinte qui filtre et renvoie les colonnes incriminées est

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

si cela peut aider quelqu'un

1
Tom Wattley

Les deux devraient fonctionner:

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

Les méthodes DataFrame isna() ou isnull() sont complètement identiques.

Remarque : Les chaînes vides '' est considéré comme étant False (non considéré comme NA)

0
prosti

j'utilise ces trois lignes de code pour imprimer les noms de colonnes qui contiennent au moins une valeur NULL:

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