2013-01-09 66 views
94

我有一個〜300K行〜40列的數據框。 我想知道是否有行包含空值 - 並將這些'空行'放入單獨的數據框中,以便我可以輕鬆地探索它們。Python Pandas如何從DataFrame中選擇具有一個或多個空值的行而不顯式列出列?

我可以明確地創建遮罩:

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

或者我可以這樣做:

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

是否有這樣做(在他們的空值定位行)的更優雅的方式?

回答

174

[更新以適應現代pandas,其中有isnullDataFrame個方法..]

您可以使用isnullany建立一個布爾系列,並用它來索引你的框架:

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

[對於舊pandas:]

你可以使用的功能,而不是isnull方法:

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 

導致相當緊湊:

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

那麼當你永遠需要它,你可以輸入:

nans(your_dataframe) 
相關問題