Dans Python Pandas, quelle est la meilleure façon de vérifier si un DataFrame a une (ou plusieurs) valeurs NaN?
Je connais la fonction pd.isnan
, mais cela renvoie un DataFrame de booléens pour chaque élément. Ce message ici ne répond pas exactement à ma question non plus.
Réponses:
La réponse de jwilner est parfaite . J'explorais pour voir s'il y avait une option plus rapide, car d'après mon expérience, la somme des tableaux plats est (étrangement) plus rapide que de compter. Ce code semble plus rapide:
Par exemple:
df.isnull().sum().sum()
est un peu plus lent, mais bien sûr, a des informations supplémentaires - le nombre deNaNs
.la source
pandas
n'y ait pas de fonction intégrée pour cela. C'est vrai d'après @ JGreenwell's post quidf.describe()
peut le faire, mais pas de fonction directe.df.describe()
(sans trouver deNaN
s). Avec une baie de 1 000 x 1 000, un seul appel prend 1,15 seconde.df.isnull().values.sum()
est un peu plus rapide quedf.isnull().values.flatten().sum()
.flatten()
affiche. Merci.df.isnull().values.any()
, pour moi c'est plus rapide que les autres.Vous avez plusieurs options.
Maintenant, le bloc de données ressemble à ceci:
df.isnull().any().any()
- Cela renvoie une valeur booléenneVous savez
isnull()
ce qui retournerait une trame de données comme celle-ci:Si vous le faites
df.isnull().any()
, vous pouvez trouver uniquement les colonnes qui ont desNaN
valeurs:Un autre
.any()
vous dira si l'un des éléments ci-dessus estTrue
df.isnull().sum().sum()
- Cela retourne un entier du nombre total deNaN
valeurs:Cela fonctionne de la même manière que le
.any().any()
fait, en donnant d'abord une somme du nombre deNaN
valeurs dans une colonne, puis la somme de ces valeurs:Enfin, pour obtenir le nombre total de valeurs NaN dans le DataFrame:
la source
.any(axis=None)
place de.any().any()
?Pour savoir quelles lignes contiennent des NaN dans une colonne spécifique:
la source
non_nan_rows = df[df['name column'].notnull()]
.Si vous avez besoin de savoir combien de lignes contiennent "un ou plusieurs
NaN
s":Ou si vous devez retirer ces lignes et les examiner:
la source
df.isnull().any().any()
devrait le faire.la source
Pour ajouter une réponse brillante à Hobs, je suis très nouveau sur Python et Pandas, veuillez donc signaler si je me trompe.
Pour savoir quelles lignes ont des NaN:
effectuerait la même opération sans avoir besoin de transposer en spécifiant l'axe de any () comme 1 pour vérifier si «True» est présent dans les lignes.
la source
any(axis=1)
simplification concise .Syntaxe super simple:
df.isna().any(axis=None)
À partir de la version 0.23.2 , vous pouvez utiliser
DataFrame.isna
+DataFrame.any(axis=None)
oùaxis=None
spécifie la réduction logique sur l'ensemble du DataFrame.Alternatives utiles
numpy.isnan
Une autre option performante si vous utilisez des versions plus anciennes de pandas.
Alternativement, vérifiez la somme:
Series.hasnans
Vous pouvez également appeler de manière itérative
Series.hasnans
. Par exemple, pour vérifier si une seule colonne contient des NaN,Et pour vérifier si une colonne contient des NaN, vous pouvez utiliser une compréhension avec
any
(qui est une opération de court-circuit).C'est en fait très rapide.
la source
Puisqu'aucun n'a mentionné, il y a juste une autre variable appelée
hasnans
.df[i].hasnans
afficheraTrue
si une ou plusieurs des valeurs de la série pandas sont NaN,False
sinon. Notez que ce n'est pas une fonction.pandas version '0.19.2' et '0.20.2'
la source
df = DataFrame([1,None], columns=['foo'])
, alorsdf.hasnans
jettera unAttributeError
, maisdf.foo.hasnans
reviendraTrue
.Puisqu'il
pandas
doit le découvrirDataFrame.dropna()
, j'ai jeté un œil pour voir comment ils l'implémentent et j'ai découvert qu'ils en faisaient usageDataFrame.count()
, qui compte toutes les valeurs non nulles dans leDataFrame
. Cf. code source pandas . Je n'ai pas évalué cette technique, mais je pense que les auteurs de la bibliothèque ont probablement fait un choix judicieux sur la façon de le faire.la source
laissez -
df
être le nom du Pandas et dataframe toute valeur qui estnumpy.nan
une valeur nulle.Si vous voulez voir le pourcentage de null dans chaque colonne
df.loc[:,list(df.loc[:,df.isnull().any()].columns)].isnull().sum()/(len(df))*100
EDIT 1:
Si vous voulez voir visuellement où vos données manquent:
la source
df.isna().sum()
?Il suffit d'utiliser math.isnan (x) , de renvoyer True si x est un NaN (pas un nombre) et False sinon.
la source
math.isnan(x)
va fonctionner quandx
est un DataFrame. Vous obtenez une TypeError à la place.Cela vous donnera le nombre de toutes les valeurs de NaN présentes dans les colonnes respectives du DataFrame.
la source
Voici une autre façon intéressante de trouver nul et de le remplacer par une valeur calculée
la source
J'ai utilisé ce qui suit et saisissez-le en une chaîne et en vérifiant la valeur nan
Cela me permet de vérifier une valeur spécifique dans une série et de ne pas simplement retourner si elle est contenue quelque part dans la série.
la source
pandas.isna()
?Le mieux serait d'utiliser:
Voici pourquoi . Ainsi
isna()
est utilisé pour définirisnull()
, mais les deux sont bien sûr identiques.C'est encore plus rapide que la réponse acceptée et couvre tous les tableaux de panda 2D.
la source
Ou vous pouvez utiliser
.info()
surDF
tels que:df.info(null_counts=True)
qui renvoie le nombre de lignes non nulles dans des colonnes telles que:la source
la source
Vérifie pour chaque colonne si elle contient Nan ou non.
la source
On peut voir les valeurs nulles présentes dans l'ensemble de données en générant heatmap en utilisant le module Seaborn heatmap
la source
Vous pouvez non seulement vérifier s'il existe des «NaN», mais également obtenir le pourcentage de «NaN» dans chaque colonne à l'aide des éléments suivants,
la source
Selon le type de données que vous traitez, vous pouvez également obtenir le nombre de valeurs de chaque colonne tout en effectuant votre EDA en définissant dropna sur False.
Fonctionne bien pour les variables catégorielles, pas tant lorsque vous avez de nombreuses valeurs uniques.
la source