如何将Pandas多级索引DataFrame的geo索引替换为映射的id_region?
解决方案
直接操作多级索引的级别即可,不用来回切换索引与列,以下是两种便捷实现方式:
方法一:直接修改索引级别值(推荐)
通过映射字典替换geo级别的索引值,再重命名索引级别,全程无需改动列结构:
- 从
mapping_df构建geo到id_region的映射字典:
geo_to_region = mapping_df['id_region'].to_dict()
- 替换df中
geo级别的索引值:
# 提取geo级别的所有值,用映射字典转换后替换原索引级别 df.index = df.index.set_levels( df.index.get_level_values('geo').map(geo_to_region), level='geo' )
- 将索引级别名称从
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'],最终数据结构如下:
| siec | id_region | value |
|---|---|---|
| X | CN-02 | 10 |
| X | CN-01 | 20 |
| Y | CN-02 | 30 |
| Y | CN-03 | 40 |
内容的提问来源于stack exchange,提问作者Stefan
相关产品推荐
相关产品推荐

