Pandas:如何轻松地将一个数据帧与不同键上的许多其他数据帧合并?

Pandas: How to easily merge a dataframe with many other dataframes on different keys?

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

基础 df: df

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

映射table1:mp_df1

STATE_CODE STATE_NAME
1          California
2          Nevada
3          Washington

映射 table 2: mp_df2

SIZE_CODE SIZE_NAME
001       Small
006       Moderate
008       Big

映射table3:mp_df3

POTENTIAL_CODE POTENTIAL_NAME
111            Small
222            Moderate
333            Promising

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

在这种情况下,我可以使用 3 个合并,但在现实生活中我有不止 3 个映射 table,所以这样做真的很烦人 'manually'。有没有更简单的方法将这些dfs合二为一?

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

您可以使用 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  

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

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 列:显然是代码和名称。