如何无需将索引移至列实现索引上的数据库式右连接?
无需将索引转成列实现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
相关产品推荐
相关产品推荐

