【问题标题】:Pandas: How to easily merge a dataframe with many other dataframes on different keys?Pandas:如何轻松地将数据框与不同键上的许多其他数据框合并?
【发布时间】:2022-01-07 14:09:39
【问题描述】:

假设我有一个带有编码列和许多映射表的“基本”DF - 例如,它们中的每一个都包含一个字典,用于来自基本 df 的一个编码列

基础 df:df

RETAILER    STATE_CODE  SIZE_CODE   POTENTIAL_CODE
store1      1           008         222
store2      2           001         111
store3      3           006         333

映射表1:mp_df1

STATE_CODE STATE_NAME
1          California
2          Nevada
3          Washington

映射表2:mp_df2

SIZE_CODE SIZE_NAME
001       Small
006       Moderate
008       Big

映射表3:mp_df3

POTENTIAL_CODE POTENTIAL_NAME
111            Small
222            Moderate
333            Promising

所以基表对每个映射表都有一个单独的键。

在这种情况下,我可以使用 3 个合并,但在现实生活中,我有不止 3 个映射表,因此“手动”执行它真的很烦人。有没有更简单的方法将这些 df 组合成一个?

RETAILER    STATE_CODE  SIZE_CODE   POTENTIAL_CODE STATE_NAME SIZE_NAME POTENTIAL_NAME
store1      1           008         222            California Big       Moderate  
store2      2           001         111            Nevada     Small     Small
store3      3           006         333            Washington Moderate  Promising

【问题讨论】:

  • 嗨,你的尝试是什么(作为代码)?它在哪里失败(如果有的话)?
  • 您好,刚刚想通了,简直不敢相信这有多么简单。 :)

标签: pandas join merge left-join


【解决方案1】:

您可以使用pd.concatmap

out = pd.concat([df,
    df['STATE_CODE'].map(mp_df1.set_index('STATE_CODE').squeeze()),
    df['SIZE_CODE'].map(mp_df2.set_index('SIZE_CODE').squeeze()),
    df['POTENTIAL_CODE'].map(mp_df3.set_index('POTENTIAL_CODE').squeeze())], axis=1)
print(out)

# Output:
  RETAILER STATE_CODE SIZE_CODE POTENTIAL_CODE  STATE_CODE SIZE_CODE  \
0   store1          1       008            222  California       Big   
1   store2          2       001            111      Nevada     Small   
2   store3          3       006            333  Washington  Moderate   

  POTENTIAL_CODE  
0       Moderate  
1          Small  
2      Promising  

【讨论】:

    【解决方案2】:

    我真的不敢相信这个解决方案有多简单,尽管它可能还没有优化。

    results = df
    dataframes_list = ['mp_df1', 'mp_df2', 'mp_df3']
    
    for i in range(len(dataframes_list)):
        results = pd.merge(results, dataframes_list[i], how='left')
    
    

    似乎工作得很好 - 假设映射表只有 2 列:代码和名称,显然。

    【讨论】:

      猜你喜欢
      • 2012-10-17
      • 1970-01-01
      • 2021-12-14
      • 1970-01-01
      • 2018-08-06
      • 1970-01-01
      • 2020-01-28
      • 1970-01-01
      • 2016-08-13
      相关资源
      最近更新 更多