Pandas双索引DataFrame按不同索引层级合并的问题求解
错误原因
- 参数逻辑冲突:你写的代码同时指定了
left_on和left_index=True两个关联参数,前者表示用左表的指定列做关联键,后者表示用左表的索引做关联键,同时指定时pandas无法正常识别关联逻辑,会导致索引丢失。 - df1是两级MultiIndex结构,直接执行merge操作默认会重置索引为默认整数序列,所以原来的index_2会不可见。
实现方案
推荐两种可行写法,第二种无需改动原有索引结构,更简洁:
方法1:索引转列后两次merge
先把多级索引转为普通列,分别匹配两级索引对应的value后再恢复索引结构:
# 多级索引转普通列 df1_reset = df1.reset_index() # 匹配index_1对应的value df1_reset = df1_reset.merge( df2.rename(columns={'value': 'value_index_1'}), left_on='index_1', right_on='id', how='left' ).drop('id', axis=1) # 匹配index_2对应的value df1_reset = df1_reset.merge( df2.rename(columns={'value': 'value_index_2'}), left_on='index_2', right_on='id', how='left' ).drop('id', axis=1) # 恢复原来的多级索引结构 df_final = df1_reset.set_index(['index_1', 'index_2'])
方法2:索引直接映射(更简洁)
先基于df2构建id到value的映射字典,直接读取df1的两级索引值做映射即可:
# 构建id到value的映射字典 id_map = df2.set_index('id')['value'].to_dict() # 分别映射两级索引生成新列 df1['value_index_1'] = df1.index.get_level_values('index_1').map(id_map) df1['value_index_2'] = df1.index.get_level_values('index_2').map(id_map)
注:你给出的预期结果中最后一行的
value_index_2写为value_c_2属于笔误,实际匹配结果应为value_b_2。
内容的提问来源于stack exchange,提问作者Jonas Palačionis
相关产品推荐
相关产品推荐

