id is_happy is_sad is_mad is_sorry
1 1 0 1 0
2 1 0 1 0
3 0 1 1 0
4 0 0 0 1
5 0 1 1 0
6 1 0 1 0
7 1 1 1 1
我想得到is_happy、is_sad和is_sorry等于1 的行
预期输出:
id is_happy is_sad is_mad is_sorry
7 1 1 1 1
我怎么能做到这一点,而不把多个条件与切片器如下。在许多条件下,这会变得困难吗?
df[(df.is_happy == 1) & (df.is_sad == 1) & (df.is_sorry == 1)]
尝试
out = df[df.drop(['id','is_mad'],1).all(1)]
id is_happy is_sad is_mad is_sorry
6 7 1 1 1 1
您可以使用np.logical_and.reduce
保持多个相等检查的紧凑性。定义一个列表,其中每个元组指定要检查相等性的列和值。然后,我们将其与&
逻辑相结合,以找到每个条件都为True的行。
这种方法很容易扩展到您可能希望某些列为0,而其他列为1(或任何值(的情况。
import numpy as np
equality_l = [('is_happy', 1), ('is_sad', 1), ('is_sorry', 1)]
m = np.logical_and.reduce([df[col].eq(val) for col,val in equality_l])
df.loc[m]
# id is_happy is_sad is_mad is_sorry
#6 7 1 1 1 1