2015-06-18 15 views
8

Mam ramkę danych z niektórymi kolumnami zawierającymi nan. Chciałbym upuścić te kolumny z pewną liczbą nan. Na przykład w poniższym kodzie, chciałbym upuścić dowolną kolumnę z 2 lub więcej nan. W takim przypadku kolumna "C" zostanie opuszczona, a tylko "A" i "B" będą przechowywane. Jak mogę to wdrożyć?pandy kolumny danych ramki danych o numerze 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 

Odpowiedz

17

Jest thresh param za dropna, wystarczy zdać długość df - liczba NaN wartości chcesz jako próg:

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 

Więc powyżej spadnie każdą kolumnę, która nie spełnia kryteriów długości df (liczba rzędów) - 2 jako liczba wartości innych niż Na.

+1

Dzięki. Literówka w twoim kodzie 'len (df)' powinna brzmieć 'len (dff)' – pyan

+0

Poprawione teraz, dobre miejsce – EdChum

+0

Czy wiesz, czy można zastosować thresh z wyjątkiem podzbioru określonych kolumn? Dziękuję Ci. – pceccon

0

Oto możliwe rozwiązanie:

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] 

Albo

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

Można użyć warunkową listowych:

>>> 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

Polecam metodę drop. Jest to alternatywne rozwiązanie:

dff.drop(dff.loc[:,len(dff) - dff.isnull().sum() <2], axis=1) 
Powiązane problemy