基于另一数据框列从一列中减去值

时间:2021-06-14 09:18:15

标签: python pandas

我有 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_1val 中的相应值减去 df_2val 中的值,以便结果如下所示:

id      val

abc     5
def     -10
hij     27
loi     5 

我尝试使用 .groupby() 但没有任何有价值的东西出来,我相信有一种简单的方法可以做到这一点。

2 个答案:

答案 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
相关问题