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?


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

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é.


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


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.


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

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)


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]

Merci pour les multiples approches!
Mike Rapadas le
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.