我有一个包含多列的pandas数据框。单层索引。
我希望删除列中所有值的列== 0
我能够通过循环遍历每一列,测试并创建一个布尔数组来实现。 然后我转置,切片和转置回来
BUT
我必须认为有更好的方法。
答案 0 :(得分:3)
只需使用布尔条件制作掩码,然后调用any
并传递参数axis=0
以删除所有NaN
的列,any
调用将创建一个布尔系列,您可以使用它来选择所有值都不是NaN
的列:
In [18]:
df = pd.DataFrame({'a':np.random.randn(5), 'b':0,'c':np.random.randn(5),'d':0, 'e':np.arange(5)})
df
Out[18]:
a b c d e
0 -0.546906 0 0.235070 0 0
1 0.260935 0 0.650391 0 1
2 0.419727 0 -1.002794 0 2
3 -0.283556 0 0.668378 0 3
4 0.924392 0 -1.297040 0 4
In [28]:
df[df.columns[(df!=0).any(axis=0)]]
Out[28]:
a c e
0 -0.546906 0.235070 0
1 0.260935 0.650391 1
2 0.419727 -1.002794 2
3 -0.283556 0.668378 3
4 0.924392 -1.297040 4
In [27]:
(df!=0).any(axis=0)
Out[27]:
a True
b False
c True
d False
e True
dtype: bool
答案 1 :(得分:0)
这是使用列表理解的解决方案:
df = pd.DataFrame({'a': [1,2], 'b': [0,0], 'c': [3,4], 'd': [0, 0]})
df[[col for col in df if ~df[col].eq(0).all()]]
Out[11]:
a c
0 1 3
1 2 4