You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 12:45:01