2013-01-09 11 views
94

Ho un dataframe con ~ 300K righe e ~ 40 colonne. Voglio scoprire se alcune righe contengono valori nulli e mettere queste righe 'nulle' in un dataframe separato in modo da poterle facilmente esplorare.Panda Python Come selezionare le righe con uno o più null da un DataFrame senza elencare le colonne esplicitamente?

posso creare una maschera in modo esplicito:

mask=False 
for col in df.columns: mask = mask | df[col].isnull() 
dfnulls = df[mask] 

O posso fare qualcosa di simile:

df.ix[df.index[(df.T == np.nan).sum() > 1]] 

C'è un modo più elegante di farlo (individuando le righe con valori nulli in loro)?

risposta

174

[Aggiornamento di adattarsi al moderno pandas, che ha isnull come metodo di DataFrame s ..]

È possibile utilizzare isnull e any per costruire una serie booleano e l'uso che per indicizzare la cornice:

>>> df = pd.DataFrame([range(3), [0, np.NaN, 0], [0, 0, np.NaN], range(3), range(3)]) 
>>> df.isnull() 
     0  1  2 
0 False False False 
1 False True False 
2 False False True 
3 False False False 
4 False False False 
>>> df.isnull().any(axis=1) 
0 False 
1  True 
2  True 
3 False 
4 False 
dtype: bool 
>>> df[df.isnull().any(axis=1)] 
    0 1 2 
1 0 NaN 0 
2 0 0 NaN 

[Per le versioni precedenti pandas:]

È possibile utilizzare la funzione isnull invece del metodo:

In [56]: df = pd.DataFrame([range(3), [0, np.NaN, 0], [0, 0, np.NaN], range(3), range(3)]) 

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 

In [58]: pd.isnull(df) 
Out[58]: 
     0  1  2 
0 False False False 
1 False True False 
2 False False True 
3 False False False 
4 False False False 

In [59]: pd.isnull(df).any(axis=1) 
Out[59]: 
0 False 
1  True 
2  True 
3 False 
4 False 

che porta alla piuttosto compatto:

In [60]: df[pd.isnull(df).any(axis=1)] 
Out[60]: 
    0 1 2 
1 0 NaN 0 
2 0 0 NaN 
8
nans = lambda df: df[df.isnull().any(axis=1)] 

poi, quando mai ne avete bisogno è possibile digitare:

nans(your_dataframe) 
Problemi correlati