2014-12-03 324 views
3

刪除所有列用的NaN,0和NA我有一個數據幀,看起來像這樣:熊貓:從數據幀

import pandas as pd 
import numpy as np 

df = pd.DataFrame({'A': [1, 2.1, np.nan, 4.7, 5.6, 6.8], 
       'B': [0, np.nan, np.nan, 0, 0, 0], 
       'C': [0, 0, 0, 0, 0, 0.0], 
       'D': [5, 5, 5, 5, 5.6, 6.8], 
       'E': ['NA', 'NA', 'NA', 'NA', 'NA', 'NA'],}) 

我怎麼會丟棄所有的NANans0在列,所以我會獲得以下輸出?

df2 = pd.DataFrame({'A': [1, 2.1, np.nan, 4.7, 5.6, 6.8], 
       'D': [5, 5, 5, 5, 5.6, 6.8],}) 

到目前爲止,我知道.dropna()將擺脫所有的nan還我試圖df2=df[~(df==0).all(axis=1)],並沒有奏效。

+0

你想留下只是列'C'和'D'(不是'A'和'D'是你的例子)嗎? – 2014-12-03 13:59:12

+0

@ajcr我只想要A和D,因爲他們的數據沒有列,全部爲0,Nan或NA – ccsv 2014-12-03 14:00:38

+0

啊我現在看到了 - 謝謝。 – 2014-12-03 14:01:24

回答

1
>>> df 
    A B C D E 
0 1.0 0 0 5.0 NA 
1 2.1 NaN 0 5.0 NA 
2 NaN NaN 0 5.0 NA 
3 4.7 0 0 5.0 NA 
4 5.6 0 0 5.6 NA 
5 6.8 0 0 6.8 NA 
>>> f = df.replace([0,'NA'], np.nan).apply(lambda x: any(~x.isnull())) 
>>> f 
A  True 
B False 
C False 
D  True 
E False 
dtype: bool 
>>> df.loc[:,f] 
    A D 
0 1.0 5.0 
1 2.1 5.0 
2 NaN 5.0 
3 4.7 5.0 
4 5.6 5.6 
5 6.8 6.8 
1

你可以嘗試使用df.isin()all()找到不只包含空值,然後使用這個數組來選擇df相關列列的排列:

>>> df[df.columns[(~df.isin([NaN, 'NA', 0])).all().values]] 
    A D 
0 1.0 5.0 
1 2.1 5.0 
2 NaN 5.0 
3 4.7 5.0 
4 5.6 5.6 
5 6.8 6.8 

或者更簡潔:df.loc[:, (~df.isin([NaN, 'NA', 0])).all()]

+0

你忘了NaN前面的np – ccsv 2014-12-03 14:26:42