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

如何无需将索引移至列实现索引上的数据库式右连接?

无需将索引转成列实现DataFrame右连接

我需要基于索引对df1和df2执行右连接生成df3,目前能用这段代码实现,但想避免把索引转成列的操作,试了merge、join、concat都没得到目标结果:

df3 = df1.reset_index().merge(df2.reset_index(), how='right', on=df2.index.names).set_index(df1.index.names)

数据示例

df1(多级索引):

data1
id1 id2       
1   1        1
2   2        2

df2(单级索引):

data2
id2       
1        1
2        2
3        3

目标结果df3

data1  data2
id1 id2              
1.0 1      1.0      1
2.0 2      2.0      2
NaN 3      NaN      3

解决方案

因为df1是多级索引(id1, id2),df2是单级索引(id2),直接用merge匹配全索引会因层级数量不匹配报错。可以用以下两种方式实现:

方法1:临时转换单个索引层级(简洁易读)

只把df1的id1索引临时转成列,保留id2作为索引执行连接,之后再恢复索引结构:

df3 = (df1.reset_index(level='id1')
         .merge(df2, how='right', left_index=True, right_index=True)
         .set_index('id1', append=True)
         .reorder_levels(['id1', 'id2']))

方法2:完全不转索引(略繁琐)

通过left_on指定df1的id2索引层级来匹配df2的索引,之后手动重构多级索引:

import pandas as pd

merged = df1.merge(df2, how='right', left_on=df1.index.get_level_values('id2'), right_index=True)
# 为新增的id2=3行补充NaN的id1值
id1_vals = df1.index.get_level_values('id1').append(pd.Series([pd.NA]))
df3 = merged.set_index([id1_vals, 'id2']).reorder_levels(['id1', 'id2'])

两种方法都能得到目标df3,方法1更推荐,因为代码简洁且仅临时转换了单个索引层级,符合你不想把索引全转成列的需求。

内容的提问来源于stack exchange,提问作者stackhatter

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 13:25:17