如何使用pandas从数据框中删除所有列值为零的行。
df = pd.DataFrame({'a':[1,0,1,0], 'b':[1,0,0,0], 'c':[1,0,1,0], 'd':[1,0,0,0]}, index=['aa','bb','cc','dd'])
df.index.name = 'name'
a b c d
name
aa 1 1 1 1
bb 0 0 0 0
cc 1 0 1 0
dd 0 0 0 0
我想从dataframe中删除bb和dd行,因为所有的列值都是空的。这是删除pandas中列的方法,但不包括行。
答案 0 :(得分:1)
您可以boolean indexing
使用mask
的所有列a
与[{1}}一起使用0
,所有值均为True
all
:
mask = ~(df.ix[:,'a':] == 0).all(1)
print (mask)
0 True
1 False
2 True
3 False
dtype: bool
print (df[mask])
name a b c d
0 aa 1 1 1 1
2 cc 1 0 1 0
检查至少一个1
的另一个解决方案返回相同的输出:
print ((df.ix[:,'a':]).any(1))
0 True
1 False
2 True
3 False
dtype: bool
print (df[(df.ix[:,'a':]).any(1)])
name a b c d
0 aa 1 1 1 1
2 cc 1 0 1 0
如果name
是索引名称,第一列是索引:
print (df[~(df == 0).all(1)])
a b c d
name
aa 1 1 1 1
cc 1 0 1 0
或者:
print (df[df.any(1)])
a b c d
name
aa 1 1 1 1
cc 1 0 1 0
答案 1 :(得分:0)
使用any()
,如果有任何True
值(即不同于0的值),则返回True
。
df = df[df.any(axis=1)]
至于你的例子,之前:
In[1]: df
Out[1]: a b c d
name
aa 1 1 1 1
bb 0 0 0 0
cc 1 0 1 0
dd 0 0 0 0
之后:
a b c d
name
aa 1 1 1 1
cc 1 0 1 0