2013-01-09 8 views
94

Mam ramkę danych z ~ 300K wierszy i ~ 40 kolumn. Chcę dowiedzieć się, czy jakiekolwiek wiersze zawierają wartości null - i umieścić te "puste" wiersze w oddzielnej ramce danych, aby móc je łatwo eksplorować.Pandy Pythona Jak wybrać wiersze z jedną lub więcej wartościami null z obiektu DataFrame bez jawnego wpisywania kolumn?

mogę utworzyć maskę wyraźnie:

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

Albo mogę zrobić coś takiego:

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

Czy jest bardziej elegancki sposób to zrobić (lokalizowanie wiersze z wartości null w nich)?

Odpowiedz

174

[Aktualizacja dostosować się do nowoczesnego pandas, który ma isnull jako metoda DataFrame s ..]

Można użyć isnull i any zbudować logiczną Series i użyć jej do indeksu w ramce:

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

[przypadku starszych pandas:]

Można użyć funkcji isnull zamiast metody:

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 

prowadzącej do dość kompaktowa:

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

wtedy, gdy kiedykolwiek jest to potrzebne można wpisać:

nans(your_dataframe) 
Powiązane problemy