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))
时间测试