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

如何将Pandas多级索引DataFrame的geo索引替换为映射的id_region?

解决方案

直接操作多级索引的级别即可,不用来回切换索引与列,以下是两种便捷实现方式:

方法一:直接修改索引级别值(推荐)

通过映射字典替换geo级别的索引值,再重命名索引级别,全程无需改动列结构:

  1. 从mapping_df构建geo到id_region的映射字典:
geo_to_region = mapping_df['id_region'].to_dict()
  1. 替换df中geo级别的索引值:
# 提取geo级别的所有值,用映射字典转换后替换原索引级别
df.index = df.index.set_levels(
    df.index.get_level_values('geo').map(geo_to_region),
    level='geo'
)
  1. 将索引级别名称从geo改为id_region:
df.index = df.index.rename('id_region', level='geo')

方法二:合并后快速重构索引

如果习惯用join操作,可合并映射表后直接重构索引:

# 合并mapping_df,将id_region列加入df
df = df.join(mapping_df)
# 把geo索引转为列,再将id_region设为二级索引,最后删除临时列
df = df.reset_index(level='geo').set_index('id_region', append=True).drop(columns='geo')

测试示例

先构造测试数据验证效果:

import pandas as pd

# 构造多级索引测试df
df = pd.DataFrame(
    {'value': [10, 20, 30, 40]},
    index=pd.MultiIndex.from_tuples(
        [('X', 'SH'), ('X', 'BJ'), ('Y', 'SH'), ('Y', 'GZ')],
        names=['siec', 'geo']
    )
)

# 构造映射表测试数据
mapping_df = pd.DataFrame(
    {'id_region': ['CN-01', 'CN-02', 'CN-03']},
    index=pd.Index(['BJ', 'SH', 'GZ'], name='geo')
)

执行方法一代码后,df的索引会变为['siec', 'id_region'],最终数据结构如下:

siecid_regionvalue
XCN-0210
XCN-0120
YCN-0230
YCN-0340

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 08:45:48