我有条件地希望沿着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 ? (很大)
答案 0 :(得分:5)
在减少之前,通过将pandas
和a
设置为索引来利用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']]