【问题标题】:Doing a pandas left merge with duplicate column names (want to delete left and keep right) [duplicate]用重复的列名做一个熊猫左合并(想删除左边并保持右边)[重复]
【发布时间】:2020-06-24 21:25:16
【问题描述】:

假设我有 df_1

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

和 df_2

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

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

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

所以基本上右表中的“Amt”值替换了左表中适用的“Amt”值。

当我尝试时

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

我明白了:

       Day         Month       Amt_X   Amt_Y              
 --------------- --------- ---------  -------
  Monday            Jan      10        999       
  Tuesday           Feb      20        1000000
  Wednesday         Feb      30        1000000
  Thursday          April    40        123456
  Friday            April    50        123456

有人知道一个简单有效的解决方法吗?谢谢!

【问题讨论】:

  • 你需要一个联合或更新语句而不是左合并,在上面的帖子中有详细说明。

标签: python pandas join merge


【解决方案1】:

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

策略 #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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-01-04
    • 1970-01-01
    • 2021-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-12
    相关资源
    最近更新 更多