Comment trouver quelles colonnes contiennent une valeur NaN dans le cadre de données Pandas

144

Étant donné une base de données pandas contenant des valeurs NaN possibles dispersées ici et là:

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

Denvar
la source
5
df.isna().any()[lambda x: x]travaille pour moi
matanster

Réponses:

249

MISE À JOUR: utilisation de 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

comme liste de colonnes:

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

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

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 proposait 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 NaNvaleur:

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
la source
Merci pour la réponse! Je cherche à obtenir une liste des noms de colonnes (j'ai mis à jour ma question en conséquence), savez-vous comment?
denvar
Connaissez-vous un bon moyen de sélectionner toutes les colonnes avec une valeur spécifique au lieu de valeurs nulles?
gregorio099
1
Ça ne fait rien! Remplacez simplement .isnull () par .isin (['xxx']) pour rechercher des valeurs au lieu de df.columns[df.isin['xxx'].any()].tolist()
null
@ gregorio099, je le ferais de cette façon:df.columns[df.eq(search_for_value).any()].tolist()
MaxU
1
Belle réponse, déjà votée. Idée - pouvez - vous ajouter de nouvelles fonctions isna, notna ?
jezrael
26

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

Matheus
la source
9

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

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

si cela est utile à quelqu'un

Tom Wattley
la source
4

Dans les ensembles de données ayant un grand nombre de colonnes, il est encore mieux de voir combien de colonnes contiennent des valeurs nulles et combien n'en contiennent pas.

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

Par exemple, dans mon dataframe, il contenait 82 colonnes, dont 19 contenaient au moins une valeur nulle.

De plus, vous pouvez également supprimer automatiquement les colonnes et les lignes en fonction de ce qui a le plus de valeurs nulles
Voici le code qui fait cela intelligemment:

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

Remarque: le code ci-dessus supprime toutes vos valeurs nulles. Si vous voulez des valeurs nulles, traitez-les avant.

Pradeep Singh
la source
2

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

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

Les deux devraient fonctionner:

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

DataFrame isna()ou isnull()sont complètement identiques.

Remarque : les chaînes vides ''sont considérées comme False (non considérées comme NA)

prosti
la source
1

Cela a fonctionné pour moi,

1. Pour obtenir des colonnes ayant au moins 1 valeur nulle. (noms des colonnes)

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

2. Pour obtenir des colonnes avec nombre, avec au moins 1 valeur nulle.

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

[Facultatif] 3. Pour obtenir le pourcentage du nombre nul.

data[data.columns[data.isnull().any()]].isnull().sum() * 100 / data.shape[0]
Uday Kiran
la source
Merci pour les multiples approches!
Mike Rapadas le