Comment vérifier si une valeur est NaN dans une DataFrame Pandas
en Python Pandas, Quelle est la meilleure façon de vérifier si une DataFrame a une (ou plusieurs) valeurs NaN?
je connais la fonction pd.isnan
, mais cela renvoie une base de données de booléens pour chaque élément. ce post ici même ne répond pas exactement à ma question non plus.
12 réponses
jwilner la réponse est sur place. J'explorais pour voir s'il y avait une option plus rapide, puisque d'après mon expérience, la sommation de tableaux plats est (étrangement) plus rapide que le comptage. Ce code semble plus rapide:
df.isnull().values.any()
par exemple:
In [2]: df = pd.DataFrame(np.random.randn(1000,1000))
In [3]: df[df > 0.9] = pd.np.nan
In [4]: %timeit df.isnull().any().any()
100 loops, best of 3: 14.7 ms per loop
In [5]: %timeit df.isnull().values.sum()
100 loops, best of 3: 2.15 ms per loop
In [6]: %timeit df.isnull().sum().sum()
100 loops, best of 3: 18 ms per loop
In [7]: %timeit df.isnull().values.any()
1000 loops, best of 3: 948 µs per loop
df.isnull().sum().sum()
est un peu plus lent, mais bien sûr, a des informations supplémentaires -- le nombre de NaNs
.
Vous avez deux options.
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randn(10,6))
# Make a few areas have NaN values
df.iloc[1:3,1] = np.nan
df.iloc[5,3] = np.nan
df.iloc[7:9,5] = np.nan
maintenant la base de données ressemble à quelque chose comme ceci:
0 1 2 3 4 5
0 0.520113 0.884000 1.260966 -0.236597 0.312972 -0.196281
1 -0.837552 NaN 0.143017 0.862355 0.346550 0.842952
2 -0.452595 NaN -0.420790 0.456215 1.203459 0.527425
3 0.317503 -0.917042 1.780938 -1.584102 0.432745 0.389797
4 -0.722852 1.704820 -0.113821 -1.466458 0.083002 0.011722
5 -0.622851 -0.251935 -1.498837 NaN 1.098323 0.273814
6 0.329585 0.075312 -0.690209 -3.807924 0.489317 -0.841368
7 -1.123433 -1.187496 1.868894 -2.046456 -0.949718 NaN
8 1.133880 -0.110447 0.050385 -1.158387 0.188222 NaN
9 -0.513741 1.196259 0.704537 0.982395 -0.585040 -1.693810
- Option 1 :
df.isnull().any().any()
- ceci renvoie une valeur booléenne
vous connaissez le isnull()
qui retournerait une base de données comme celle-ci:
0 1 2 3 4 5
0 False False False False False False
1 False True False False False False
2 False True False False False False
3 False False False False False False
4 False False False False False False
5 False False False True False False
6 False False False False False False
7 False False False False False True
8 False False False False False True
9 False False False False False False
si vous le faites df.isnull().any()
, vous pouvez trouver juste les colonnes qui ont des valeurs NaN
:
0 False
1 True
2 False
3 True
4 False
5 True
dtype: bool
Un de plus .any()
vous dira si l'un des ci-dessus sont True
> df.isnull().any().any()
True
- Option 2 :
df.isnull().sum().sum()
- ceci renvoie un entier du nombre total deNaN
valeurs:
cela fonctionne de la même manière que le .any().any()
, en donnant d'abord une sommation du nombre de NaN
valeurs dans une colonne, puis la somme de ces valeurs:
df.isnull().sum()
0 0
1 2
2 0
3 1
4 0
5 2
dtype: int64
enfin, pour obtenir le nombre total de valeurs NaN dans la DataFrame:
df.isnull().sum().sum()
5
pour savoir quelles lignes ont des NaNs dans une colonne spécifique:
nan_rows = df[df['name column'].isnull()]
Si vous avez besoin de savoir combien de lignes il y a avec "un ou plusieurs NaN
s":
df.isnull().T.any().T.sum()
ou si vous devez retirer ces rangées et les examiner:
nan_rows = df[df.isnull().T.any().T]
ajouter à Hobs brilliant réponse, je suis très nouveau à Python et Pandas donc s'il vous plaît noter si je me trompe.
pour savoir quelles lignes ont des NaNs:
nan_rows = df[df.isnull().any(1)]
exécuterait la même opération sans avoir besoin de transposition en spécifiant l'axe de tout() comme 1 pour vérifier si 'True' est présent dans les lignes.
puisqu'aucun n'a mentionné, il y a juste une autre variable appelée hasnans
.
df[i].hasnans
affichera True
si une ou plusieurs des valeurs de la série pandas est NaN, False
si non. Notez que ce n'est pas une fonction.
pandas version '0.19.2 ' et' 0.20.2 '
depuis pandas
doit le découvrir pour DataFrame.dropna()
, j'ai regardé comment ils l'implémentent et j'ai découvert qu'ils ont utilisé DataFrame.count()
, qui compte toutes les valeurs non nulles dans le DataFrame
. Cf. pandas code source . Je n'ai pas comparé cette technique, mais je suppose que les auteurs de la bibliothèque sont susceptibles d'avoir fait un choix judicieux pour savoir comment faire.
Juste à l'aide de "151910920 des mathématiques".isnan (x) , retourne True si x est un NaN (pas un nombre), et False autrement.
selon le type de données que vous traitez, vous pouvez également obtenir le nombre de valeurs de chaque colonne en exécutant votre EDA en réglant dropna à False.
for col in df:
print df[col].value_counts(dropna=False)
Fonctionne bien pour les variables catégorielles, pas tellement quand vous avez beaucoup de valeurs uniques.
ou vous pouvez utiliser .info()
sur le DF
tel que:
df.info(null_counts=True)
qui renvoie le nombre de lignes non nulles dans une colonne telle que:
<class 'pandas.core.frame.DataFrame'>
Int64Index: 3276314 entries, 0 to 3276313
Data columns (total 10 columns):
n_matches 3276314 non-null int64
avg_pic_distance 3276314 non-null float64
Voici une autre façon intéressante de trouver null et de remplacer par une valeur calculée
#Creating the DataFrame
testdf = pd.DataFrame({'Tenure':[1,2,3,4,5],'Monthly':[10,20,30,40,50],'Yearly':[10,40,np.nan,np.nan,250]})
>>> testdf2
Monthly Tenure Yearly
0 10 1 10.0
1 20 2 40.0
2 30 3 NaN
3 40 4 NaN
4 50 5 250.0
#Identifying the rows with empty columns
nan_rows = testdf2[testdf2['Yearly'].isnull()]
>>> nan_rows
Monthly Tenure Yearly
2 30 3 NaN
3 40 4 NaN
#Getting the rows# into a list
>>> index = list(nan_rows.index)
>>> index
[2, 3]
# Replacing null values with calculated value
>>> for i in index:
testdf2['Yearly'][i] = testdf2['Monthly'][i] * testdf2['Tenure'][i]
>>> testdf2
Monthly Tenure Yearly
0 10 1 10.0
1 20 2 40.0
2 30 3 90.0
3 40 4 160.0
4 50 5 250.0