2017-08-17 116 views
3

我有一个简单的问题,它涉及到类似的问题here,并here所有列。删除其中所有值都为零

我想放弃从熊猫数据帧中的所有列,其中有只由零(垂直,axis=1)。我给大家举一个例子:

df = pd.DataFrame({'a':[0,0,0,0], 'b':[0,-1,0,1]}) 

    a b 
0 0 0 
1 0 -1 
2 0 0 
3 0 1 

我想删除列a,因为它只有零。

不过,我想如果可能的话做一个很好的和量化的方式。我的数据集很大 - 所以我不想循环。因此,我试过

df = df.loc[(df).any(1), (df!=0).any(0)] 

    b 
1 -1 
3 1 

它允许我删除列和行。但是,如果我只是试图放弃列,loc似乎失败。有任何想法吗?

+1

为什么马克斯的答案downvoted?你想要'b'吗? –

+1

但是,你确实想要列b,对吗? –

+0

我想删除总和为零的所有列。 – Rachel

回答

4

如果是0的问题,而不是总结,使用df.any

In [291]: df.T[df.any()].T 
Out[291]: 
    b 
0 0 
1 -1 
2 0 
3 1 

或者:

In [296]: df.T[(df != 0).any()].T # or df.loc[:, (df != 0).any()] 
Out[296]: 
    b 
0 0 
1 -1 
2 0 
3 1 
+0

很好的答案!感谢您帮助我设置正确的问题! – Rachel

+1

@Rachel请确保你下次提前知道你想要的是什么......欢呼声。 :-) –

4
In [73]: df.loc[:, df.ne(0).any()] 
Out[73]: 
    b 
0 0 
1 1 
2 0 
3 1 

或:

In [71]: df.loc[:, ~df.eq(0).all()] 
Out[71]: 
    b 
0 0 
1 1 
2 0 
3 1 

如果我们要检查那些不总结到0

In [78]: df.loc[:, df.sum().astype(bool)] 
Out[78]: 
    b 
0 0 
1 1 
2 0 
3 1 
+1

嘿,我的第二个解决方案是类似于你......要我删除它? –

+1

@cᴏʟᴅsᴘᴇᴇᴅ,一切都很好:) – MaxU

5

你是真的很近,采用any - 0被强制转换为False S:

df = df.loc[:, df.any()] 
print (df) 

    b 
0 0 
1 1 
2 0 
3 1 
+0

很好的回答!但@coldspeed是第一个回答它的人。虽然我计时了,你的解决方案似乎是最快的!谢谢! – Rachel

+0

你说得对。这次真的很难。 Coldspeed帮助我设定了正确的问题并予以回答。所以我认为Coldspeed这次应该得到检查的答案。这里的政策是什么?没有找到任何东西在Beta ... – Rachel

+1

@Rachel https://stackoverflow.com/help/someone-answers –

相关问题