2017-04-19 1 views
2

Comment créer une instruction if qui effectue les opérations suivantes:Pandas - Si toutes les valeurs de dataframe sont NaN

if all values in dataframe are nan: 
    do something 
else: 
    do something else 

Selon this post, on peut vérifier si toutes les valeurs d'une trame de données sont NNA. Je sais que l'on ne peut le faire:

if df.isnull().all(): 
    do something 

Il renvoie l'erreur suivante:

ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

Répondre

6

besoin d'un autre all, parce que d'abord all retour Series et un autre scalar:

if df.isnull().all().all(): 
    do something 

Exemple:

df = pd.DataFrame(index=range(5), columns=list('abcde')) 
print (df) 
    a b c d e 
0 NaN NaN NaN NaN NaN 
1 NaN NaN NaN NaN NaN 
2 NaN NaN NaN NaN NaN 
3 NaN NaN NaN NaN NaN 
4 NaN NaN NaN NaN NaN 

print (df.isnull()) 
     a  b  c  d  e 
0 True True True True True 
1 True True True True True 
2 True True True True True 
3 True True True True True 
4 True True True True True 

print (df.isnull().all()) 
a True 
b True 
c True 
d True 
e True 
dtype: bool 

print (df.isnull().all().all()) 
True 

if df.isnull().all().all(): 
    print ('do something') 

Si besoin solution plus rapide - numpy.isnan avec numpy.all, mais d'abord convertir toutes les valeurs à numpy array par values:

print (np.isnan(df.values).all()) 
True 

minutage:

df = pd.DataFrame(np.full((1000,1000), np.nan)) 
print (df) 

In [232]: %timeit (np.isnan(df.values).all()) 
1000 loops, best of 3: 1.23 ms per loop 

In [233]: %timeit (df.isnull().all().all()) 
100 loops, best of 3: 10 ms per loop 

In [234]: %timeit (df.isnull().values.all()) 
1000 loops, best of 3: 1.46 ms per loop 
0

amélioration plus rapide sur des années Jezréel serait df.isnull().values.all()

In [156]: df.isnull().values.all() 
Out[156]: True 

Repères

petit

In [149]: df.shape 
Out[149]: (5, 5) 

In [150]: %timeit df.isnull().values.all() 
10000 loops, best of 3: 112 µs per loop 

In [151]: %timeit df.isnull().all().all() 
1000 loops, best of 3: 271 µs per loop 

grand

In [153]: df.shape 
Out[153]: (1000, 1000) 

In [154]: %timeit df.isnull().values.all() 
10 loops, best of 3: 26.6 ms per loop 

In [155]: %timeit df.isnull().all().all() 
10 loops, best of 3: 40.8 ms per loop