Python Pandas:根据另外两列的值

时间:2017-01-17 22:32:27

标签: python pandas conditional-statements

在遍历variableA列时,我想生成一个新列,只要中的行 valuesvariableA {1}}等于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 匹配当前行values时选择variableA的总和:

variableA

但是,只要df.groupby('variableA')['values'].transform('sum') values的当前行匹配,就会选择variableB的总和。我尝试了variableA,但它似乎与.loc不太匹配。预期产出如下:

.groupby

谢谢!

2 个答案:

答案 0 :(得分:2)

好吧,你总是可以使用.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

答案 1 :(得分:2)

带有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))

enter image description here

时间测试

enter image description here