144 votes

Comment sélectionner les lignes avec NaN dans une colonne particulière ?

Étant donné ce cadre de données, comment sélectionner uniquement les lignes dont "Col2" est égal à NaN ?

In [56]: df = pd.DataFrame([range(3), [0, np.NaN, 0], [0, 0, np.NaN], range(3), range(3)], columns=["Col1", "Col2", "Col3"])

In [57]: df
Out[57]: 
   0   1   2
0  0   1   2
1  0 NaN   0
2  0   0 NaN
3  0   1   2
4  0   1   2

Le résultat devrait être celui-ci :

Out[57]: 
   0   1   2
1  0 NaN   0

243voto

qbzenker Points 1870

Essayez ce qui suit :

df[df['Col2'].isnull()]

16 votes

Ou bien df.loc[df['Col2'].isnull()] si .loc est votre genre de chose

7 votes

Q : Comment annuler le thi, c'est-à-dire où les données de la colonne "ne sont pas nulles" ? R : en utilisant la fonction .notnull() opérateur.

0 votes

Comment sélectionner les lignes d'un df, lorsque plusieurs colonnes sont nulles ? pas n'importe laquelle, mais seulement lorsqu'un ensemble de colonnes sont nulles.

14voto

MaxU Points 5284

@qbzenker a fourni le la méthode la plus idiomatique IMO

Voici quelques alternatives :

In [28]: df.query('Col2 != Col2') # Using the fact that: np.nan != np.nan
Out[28]:
   Col1  Col2  Col3
1     0   NaN   0.0

In [29]: df[np.isnan(df.Col2)]
Out[29]:
   Col1  Col2  Col3
1     0   NaN   0.0

1voto

NewbieAF Points 608

Si vous souhaitez sélectionner les lignes contenant au moins une valeur NaN, vous pouvez utiliser la méthode suivante isna + any en axis=1 :

df[df.isna().any(axis=1)]

Si vous souhaitez sélectionner les lignes contenant un certain nombre de valeurs NaN, vous pouvez utiliser la méthode suivante isna + sum en axis=1 + gt . Par exemple, le code suivant récupérera les lignes contenant au moins 2 valeurs NaN :

df[df.isna().sum(axis=1)>1]

Si vous souhaitez limiter la vérification à des colonnes spécifiques, vous pouvez d'abord les sélectionner, puis vérifier :

df[df[['Col1', 'Col2']].isna().any(axis=1)]

Si vous souhaitez sélectionner les lignes contenant toutes les valeurs NaN, vous pouvez utiliser la méthode suivante isna + all en axis=1 :

df[df.isna().all(axis=1)]

Si vous souhaitez sélectionner des lignes ne contenant aucune valeur NaN, vous pourriez notna + all en axis=1 :

df[df.notna().all(axis=1)]

Ceci est équivalent à :

df[df['Col1'].notna() & df['Col2'].notna() & df['Col3'].notna()]

ce qui peut devenir fastidieux si les colonnes sont nombreuses. Au lieu de cela, vous pouvez utiliser functools.reduce à la chaîne & opérateurs :

import functools, operator
df[functools.reduce(operator.and_, (df[i].notna() for i in df.columns))]

ou numpy.logical_and.reduce :

import numpy as np
df[np.logical_and.reduce([df[i].notna() for i in df.columns])]

Si vous cherchez à filtrer les lignes où il n'y a pas de NaN dans une colonne en utilisant query vous pouvez le faire en utilisant engine='python' paramètre :

df.query('Col2.notna()', engine='python')

ou utiliser le fait que NaN!=NaN comme @MaxU - arrêtez le WAR contre UA

df.query('Col2==Col2')

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X