Python:根据其他两列的值查找列的和

Python:根据其他两列的值查找列的和,python,pandas,conditional-statements,Python,Pandas,Conditional Statements,在遍历variableA列时,每当variableA或variableB中的一行等于variableA的当前行值时,我想生成一个新列,它是值的总和。示例数据: values variableA variableB 0 134 1 3 1 12 2 6 2 43 1 2 3 54 3 1 4 16

在遍历
variableA
列时,每当
variableA
variableB
中的一行等于
variableA
的当前行值时,我想生成一个新列,它是
值的总和。示例数据:

    values    variableA  variableB
  0  134       1             3
  1  12        2             6
  2  43        1             2
  3  54        3             1
  4  16        2             7
只要
variableA
variableA
的当前行匹配,我就可以使用以下方法选择
值的总和:

df.groupby('variableA')['values'].transform('sum')
但是,每当
variableB
variableA
的当前行匹配时,选择
值的总和就无法实现。我试过
.loc
,但它似乎不适合
.groupby
。预期产出如下:

    values    variableA  variableB  result
  0  134       1             3      231
  1  12        2             6      71
  2  43        1             2      231
  3  54        3             1      188
  4  16        2             7      71

谢谢

好吧,您可以始终使用
.apply
,但请注意:它可能很慢:

>>> df
   values  variableA  variableB
0     134          1          3
1      12          2          6
2      43          1          2
3      54          3          1
4      16          2          7
>>> df.apply(lambda S: df.loc[(df.variableA == S.variableA) | (df.variableB == S.variableA), 'values'].sum(), axis=1)
0    231
1     71
2    231
3    188
4     71
dtype: int64
当然,您必须分配它

>>> df['result'] = df.apply(lambda S: df.loc[(df.variableA == S.variableA) | (df.variableB == S.variableA), 'values'].sum(), axis=1)
>>> df
   values  variableA  variableB  result
0     134          1          3     231
1      12          2          6      71
2      43          1          2     231
3      54          3          1     188
4      16          2          7      71

一种带有numpy广播的矢量化方法

vars = df[['variableA', 'variableB']].values
matches = (vars[:, None] == vars[:, [0]]).any(-1)

df.assign(result=df['values'].values @ matches)  # @ operator with python 3
# use this for use python 2
# df.assign(result=df['values'].values.dot(matches))


时间测试