2014-12-03 212 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