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

如何合并两个DataFrame并保留其中一个的多级索引结构?

保留多级索引的DataFrame合并方案

要保留第一个DataFrame的多级索引结构,核心是避免合并过程中丢失索引信息,以下是两种实用方法,搭配模拟示例说明:

先明确模拟场景

先构建和你描述匹配的测试数据:

import pandas as pd

# 多级索引的DataFrame(对应你的"Multi-level dataframe")
df_multi = pd.DataFrame(
    {'销售额': [1000, 800, 1200, 900]},
    index=pd.MultiIndex.from_tuples(
        [('华东', '上海'), ('华东', '杭州'), ('华北', '北京'), ('华北', '天津')],
        names=['大区', '城市']
    )
)

# 基础结构的DataFrame(对应你的"Basic dataframe")
df_basic = pd.DataFrame(
    {'大区': ['华东', '华东', '华北', '华北'], '城市': ['上海', '杭州', '北京', '天津'], '成本': [600, 500, 700, 550]}
)

方法一:重置索引合并后恢复(通用场景)

如果不确定合并键的对应关系,用这种最稳妥:

  1. 先把多级索引转为普通列
  2. 基于共同列完成合并
  3. 重新设置回多级索引
# 1. 把多级索引转成列
df_multi_reset = df_multi.reset_index()
# 2. 按共同列合并
merged_df = pd.merge(df_multi_reset, df_basic, on=['大区', '城市'])
# 3. 恢复多级索引
merged_multi = merged_df.set_index(['大区', '城市'])

方法二:用join直接对齐索引(更简洁)

如果基础DataFrame的列刚好和多级索引的级别完全对应,可以先给基础表设置匹配索引,再用join合并:

# 把基础表的匹配列设置为索引,和多级索引对齐
df_basic_indexed = df_basic.set_index(['大区', '城市'])
# 直接join,自动保留多级索引结构
merged_multi = df_multi.join(df_basic_indexed)

关键注意事项

  • 必须保证合并键完全匹配:多级索引的每个级别名称(比如示例中的「大区」「城市」)要和基础表的列名一致
  • 如果只需要按部分索引级别合并(比如只按「大区」),可以用merge的left_index=True指定左表用索引,right_on指定右表的匹配列:
    df_basic_single = pd.DataFrame({'大区': ['华东', '华北'], '区域预算': [5000, 4000]})
    # 按大区合并,保留原多级索引
    merged_partial = pd.merge(df_multi, df_basic_single, left_index=True, right_on='大区').drop('大区', axis=1)
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 08:01:41