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.concat
和 map
:
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 列:显然是代码和名称。
假设我有一个 '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.concat
和 map
:
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 列:显然是代码和名称。