我有 2 个数据框:
df_1 = pd.DataFrame([['abc', 10], ['def', 20], ['hij', 30], ['loi', 5]],
columns=['id', 'val'])
df_1
id val
abc 10
def 20
hij 30
loi 5
df_2 = pd.DataFrame([['abc', 5], ['a11', 5], ['pol', 7], ['hij', 3]],
columns=['id', 'val'])
df_2
id val
abc 5
a11 5
def 30
pol 7
hij 3
我想用 df_1
列 val
中的相应值减去 df_2
列 val
中的值,以便结果如下所示:
id val
abc 5
def -10
hij 27
loi 5
我尝试使用 .groupby()
但没有任何有价值的东西出来,我相信有一种简单的方法可以做到这一点。
答案 0 :(得分:1)
使用 Series.map
by id
by Series
from df_2
然后减去 Series.sub
并指定 fill_value=0
如果没有匹配的相同值:
df_1 = pd.DataFrame([['abc', 10], ['def', 20], ['hij', 30], ['loi', 5]],
columns=['id', 'val'])
df_2 = pd.DataFrame([['abc', 5], ['a11', 5], ['def', 30],['pol', 7], ['hij', 3]],
columns=['id', 'val'])
df_1['new'] = df_1['val'].sub(df_1['id'].map(df_2.set_index('id')['val']), fill_value=0)
print(df_1)
id val new
0 abc 10 5.0
1 def 20 -10.0
2 hij 30 27.0
3 loi 5 5.0
详情:
print(df_1['id'].map(df_2.set_index('id')['val']))
0 5.0
1 30.0
2 3.0
3 NaN
Name: id, dtype: float64
答案 1 :(得分:0)
这行得通吗:
df_r = pd.merge(df_1,df_2, on = 'id', how = 'left').fillna(0)
df_r['val'] = df_r['val_x'] - df_r['val_y']
df_r = df_r[['id','val']]
df_r
id val
0 abc 5.0
1 def -10.0
2 hij 27.0
3 loi 5.0