我正在尝试从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
似乎失败了。有什么想法吗?
答案 0 :(得分:7)
你真的很接近,使用any
- 0
投放到False
s:
df = df.loc[:, df.any()]
print (df)
b
0 0
1 1
2 0
3 1
答案 1 :(得分: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
答案 2 :(得分: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