2015-06-18 31 views
8

Ho un dataframe con alcune colonne contenenti nan. Mi piacerebbe rilasciare quelle colonne con un certo numero di nan. Ad esempio, nel seguente codice, mi piacerebbe rilasciare qualsiasi colonna con 2 o più nan. In questo caso, la colonna "C" verrà eliminata e verranno mantenuti solo "A" e "B". Come posso implementarlo?colonne drop di dataframe pandas per numero di nan

import pandas as pd 
import numpy as np 

dff = pd.DataFrame(np.random.randn(10,3), columns=list('ABC')) 
dff.iloc[3,0] = np.nan 
dff.iloc[6,1] = np.nan 
dff.iloc[5:8,2] = np.nan 

print dff 

risposta

17

C'è una param thresh per 012., basta passare la lunghezza del DF - il numero di NaN valori che si desidera come soglia:

In [13]: 

dff.dropna(thresh=len(dff) - 2, axis=1) 
Out[13]: 
      A   B 
0 0.517199 -0.806304 
1 -0.643074 0.229602 
2 0.656728 0.535155 
3  NaN -0.162345 
4 -0.309663 -0.783539 
5 1.244725 -0.274514 
6 -0.254232  NaN 
7 -1.242430 0.228660 
8 -0.311874 -0.448886 
9 -0.984453 -0.755416 

Così il sopra cadrà qualsiasi colonna che non soddisfa i criteri della lunghezza del df (numero di righe) - 2 come numero di valori non Na.

+1

Grazie. Un errore nel codice 'len (df)' dovrebbe essere 'len (dff)' – pyan

+0

Correggere ora, buon punto – EdChum

+0

Sai se è possibile applicare trebbri ad eccezione di un sottoinsieme di colonne specifiche? Grazie. – pceccon

0

Ecco una possibile soluzione:

s = dff.isnull().apply(sum, axis=0) # count the number of nan in each column 
print s 
    A 1 
    B 1 
    C 3 
    dtype: int64 

for col in dff: 
    if s[col] >= 2: 
     del dff[col] 

O

for c in dff: 
    if sum(dff[c].isnull()) >= 2: 
     dff.drop(c, axis=1, inplace=True) 
3

È possibile utilizzare un elenco condizionale di comprensione:

>>> dff[[c for c in dff if dff[c].isnull().sum() < 2]] 
      A   B 
0 -0.819004 0.919190 
1 0.922164 0.088111 
2 0.188150 0.847099 
3  NaN -0.053563 
4 1.327250 -0.376076 
5 3.724980 0.292757 
6 -0.319342  NaN 
7 -1.051529 0.389843 
8 -0.805542 -0.018347 
9 -0.816261 -1.627026 
0

Raccomando il metodo drop. Questa è una soluzione alternativa:

dff.drop(dff.loc[:,len(dff) - dff.isnull().sum() <2], axis=1) 
Problemi correlati