在Pandas中按行总和过滤DataFrame

时间:2016-11-04 14:43:32

标签: python pandas dataframe

我有一个数据框

[1] df
ProductIds  A   B   C   D
11210000018 0   0   0   0
11210000155 1   0   0   0
11210006508 0   0   0   0
11210007253 0   0   0   0
11210009431 0   0   0   0
11210135871 1   0   0   0

我想通过添加每一行来过滤帧,如果sum大于零,则过滤该行。对于给定的条件,结果将类似于

ProductIds  A   B   C   D
11210000155 1   0   0   0
11210135871 1   0   0   0

这样做的一种方法是使用sum添加另一列,然后按以下方式过滤:

df['Sum'] = df.sum(axis = 1)
df = df[df.Sum > 0]
df.drop(['Sum']

但是有没有一个内置的内置方法来做到这一点?我无法手动添加列,因为有数千列。感谢。

2 个答案:

答案 0 :(得分:1)

我认为如果DataFrame只有0且数字高于0,则可以使用DataFrame.all - 测试行中是否所有值0和然后使用boolean indexing

mask = (df == 0).all(axis=1)
print (mask)
ProductIds
11210000018     True
11210000155    False
11210006508     True
11210007253     True
11210009431     True
11210135871    False
dtype: bool

print (df[~mask])
             A  B  C  D
ProductIds             
11210000155  1  0  0  0
11210135871  1  0  0  0

更通用的解决方案是在boolean indexing中使用boolean mask - 不是必要的创建新列:

df = df[df.sum(axis = 1) > 0]

答案 1 :(得分:0)

另一种解决方案:

In [194]: df.query('A + B + C + D > 0')
Out[194]:
             A  B  C  D
ProductIds
11210000155  1  0  0  0
11210135871  1  0  0  0