基于来自一个热编码列的多个条件的子设置数据帧


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