关联虚拟变量等于 1 的列列表的总和

Sum of a list of columns for which the associated dummy equals 1

我有一长串带有数值的列。每列都有一个关联的虚拟变量。我想创建一个新列,其中包含列表中所有列的按行总和,因为关联的虚拟变量等于 1。
由于数据的长度,单独为每一列指定条件是不可行的。

示例数据:

df = pd.DataFrame(np.random.randint(0,100,size=(4, 3)), columns=('A', 'B', 'C'))
dummy_array = np.array([[1, 0, 0],[1, 1, 1], [0, 0, 0], [0, 1, 1]])
df[['A_dummy', 'B_dummy', 'C_dummy']] = pd.DataFrame(index=df.index,data = dummy_array)
print(df) 

   A   B   C   A_dummy  B_dummy  C_dummy
0  33  56  75        1        0        0
1  12  99  49        1        1        1
2   7  92  84        0        0        0
3  95  19  79        0        1        1 

所需的解决方案:

   A   B   C   A_dummy  B_dummy  C_dummy  ABC_sum
0  33  56  75        1        0        0       33
1  12  99  49        1        1        1      160
2   7  92  84        0        0        0        0 (or NaN)
3  95  19  79        0        1        1       98

我想不出一个解决方案可以通过列表 = ['A'、'B'、'C'] 并执行此操作。 感谢您的输入。

@mozway 提供的(非常简单的)解决方案:

abclist = ['A', 'B', 'C']       # I used a regex-filter to create this list
abc_dummylist = [item + '_dummy' for item in abclist]
df['ABC_sum'] = (df[abclist ]*df[abc_dummylist ].values).sum(axis=1)
print(df)

    A   B   C  A_dummy  B_dummy  C_dummy  ABC_sum
0  70  24  10        1        0        0       70
1   7  15   3        1        1        1       25
2  25  74  23        0        0        0        0
3  22  72  77        0        1        1      149

你可以这样做:

df['ABC_sum'] = (df[['A', 'B', 'C']]*df[['A_dummy', 'B_dummy', 'C_dummy']].values).sum(axis=1)

注意。如果你有很多列,你可以 select 它们 filter

示例:

    A   B   C  A_dummy  B_dummy  C_dummy  ABC_sum
0  92  12  74        1        0        0       92
1  40  59  36        1        1        1      135
2  88  70  40        0        0        0        0
3  78  49  53        0        1        1      102