用重复的列名向左合并熊猫(想删除左边并保持右边)

时间:2020-06-24 21:25:16

标签: python pandas join merge

因此,假设我有df_1

import pkg.emailing # 1
from pkg.emailing import email # 2

和df_2

       Day         Month       Amt              
 --------------- --------- ---------  
  Monday            Jan      10              
  Tuesday           Feb      20 
  Wednesday         Feb      30
  Thursday          April    40
  Friday            April    50 

我想在进行左合并时得到以下结果:

       Month        Amt              
 --------------- ---------
      Jan          999
      Feb          1000000
      April        123456

因此,基本上,右表中的'Amt'值将替换左表中的'Amt'值(如果适用)。

当我尝试

       Day         Month       Amt              
 --------------- --------- ---------  
  Monday            Jan      999              
  Tuesday           Feb      1000000 
  Wednesday         Feb      1000000
  Thursday          April    123456
  Friday            April    123456

我得到:

df_1.merge(df_2,how = 'left',on = 'Month')

有人知道简单有效的修复方法吗?谢谢!

1 个答案:

答案 0 :(得分:3)

此答案纯粹是对重复目标的补充。这是比这更全面的答案。

策略1

这个问题有两个部分。

使用df_2创建映射。

做到这一点的直观方法是

mapping = df_2.set_index('Month')['Amt']

创建一个可以传递给pd.Series.map

的系列对象

但是,我偏爱

mapping = dict(zip(df_2.Month, df_2.Amt))

甚至更钝化

mapping = dict(zip(*map(df_2.get, df_2)))

使用pandas.Series.map

df_1.Month.map(mapping)

0        999
1    1000000
2    1000000
3     123456
4     123456
Name: Month, dtype: int64

最后,您要将其放入现有数据框中。

创建副本

df_1.assign(Amt=df_1.Month.map(mapping))

         Day  Month      Amt
0     Monday    Jan      999
1    Tuesday    Feb  1000000
2  Wednesday    Feb  1000000
3   Thursday  April   123456
4     Friday  April   123456

覆盖现有数据

df_1['Amt'] = df_1.Month.map(mapping)

策略2

要最简洁地使用merge,请删除要替换的列。

df_1.drop('Amt', axis=1).merge(df_2)

         Day  Month      Amt
0     Monday    Jan      999
1    Tuesday    Feb  1000000
2  Wednesday    Feb  1000000
3   Thursday  April   123456
4     Friday  April   123456