熊猫根据column的值对两个数据框求和

时间:2019-09-19 19:05:08

标签: python pandas dataframe

我有条件地希望沿着y轴求和两个数据帧

例如:

  

df_1

a    b    value
1    1    1011
1    2    1012
2    1    1021
2    2    1022
  

df_2

a    b    value
9    9    99
1    2    12
2    1    21

我想制作df_1['value'] -= df_2['value'] if df_1[a] == df_2[a] & df_1[b] == df_2[b],所以输出为:

  

输出

a    b    value
1    1    1011
1    2    1000
2    1    1000
2    2    1022

有没有一种方法可以实现这一目标,而不是遍历整个 dataframe ? (很大)

3 个答案:

答案 0 :(得分:5)

在减少之前,通过将pandasa设置为索引来利用b在此处提供的索引对齐。


for df in [df1, df2]:
    df.set_index(['a', 'b'], inplace=True)

df1.sub(df2, fill_value=0).reindex(df1.index)

      value
a b
1 1  1011.0
  2  1000.0
2 1  1000.0
  2  1022.0

答案 1 :(得分:2)

你可以让

merged = pd.merge(df_1, df_2, on=['a', 'b'], left_index=True)
df_1.value[merged.index] = merged.value_x - merged.value_y

结果:

In [37]: df_1
Out[37]:
   a  b  value
0  1  1   1011
1  1  2   1000
2  2  1   1000
3  2  2   1022

答案 2 :(得分:2)

您还可以执行左联接并减去匹配值。这是这样做的方法:

(pd.merge(df_1, df_2, how='left', on=['a', 'b'], suffixes=('_1', '_2'))
 .fillna(0)
 .assign(value=lambda x: x.value_1 - x.value_2)
)[['a', 'b', 'value']]