删除所有值均为零的列

5
我有一个简单的问题,与类似的问题这里这里有关。
我试图从一个pandas数据帧中删除所有只包含零的列(垂直方向上,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
为什么Max的回答被踩了?你想要b吗? - cs95
1
但是,你确实希望列 b,对吗? - cs95
@ayhan,这不正确,因为sum([-1, 1, -1, 1])的结果是0 - MaxU - stand with Ukraine
2
@ayhan,不知何故我有一种感觉这不是原帖作者真正想要的... 当然我可能错了... - MaxU - stand with Ukraine
@MaxU 如果 OP 要求 sum = 0,那么你的答案是错误的。我认为。 - cs95
显示剩余3条评论
3个回答

15

你非常接近了,使用 any - 0 被转换为 False:

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

   b
0  0
1  1
2  0
3  1

很棒的答案!但是@coldspeed先回答了。虽然我计时了,你的解决方案似乎是最快的!谢谢! - Rachel
你说得对。这次确实很难。Coldspeed帮我设置了问题并回答了它。所以我认为这次应该把选定的答案给Coldspeed。这里的政策是什么?在Beta版中找不到任何东西... - Rachel
1
@Rachel - 如果需要更快的解决方案,需要考虑maxu或者我的答案,因为双重转置会很慢。谁是赢家 - 谁得到了被接受的答案 - 就取决于你了。 - jezrael

6
如果是关于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

非常好的答案!感谢您帮助我正确设置问题! - Rachel
1
@Rachel 下次确保提前知道你想要什么... 干杯。 :-) - cs95

5
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
嘿,我的第二个解决方案和你的相似...要我把它删除吗? - cs95
1
@cᴏʟᴅsᴘᴇᴇᴅ,一切都好 :) - MaxU - stand with Ukraine

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接