如何从具有所有列值的数据框中删除行作为布尔值false

时间:2016-08-02 13:15:44

标签: python pandas

如何使用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中列的方法,但不包括行。

2 个答案:

答案 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