如何在pandas多层索引DataFrame中垂直映射值新增索引层级
pandas多层列索引新增层级实现方案
问题核心
你需要对已有的两层列索引(顶层Region、二级Pet)的DataFrame,基于Pet->Kind的映射关系,新增第三级列索引Kind,不需要做横向/纵向合并操作,核心是重构多层列索引对象即可。
实现步骤
- 首先构造测试数据与映射字典
import pandas as pd # 初始化原始DataFrame origin_cols = pd.MultiIndex.from_tuples( [("Region1", "Cat"), ("Region1", "Dog"), ("Region2", "Cat"), ("Region2", "Dog")], names=["Region", "Pet"] ) df = pd.DataFrame( data=[[1,8,5,9], [4,3,7,1]], columns=origin_cols ) # 把参考映射表转成字典方便匹配 pet_kind_ref = pd.DataFrame({ "Pet": ["Cat", "Dog"], "Kind": ["Tabby", "Weiner"] }) pet_kind_dict = pet_kind_ref.set_index("Pet")["Kind"].to_dict()
- 提取原有列索引各层级的值,映射生成新层级取值,重构三层列索引
# 提取原有两个层级的索引值 region_vals = df.columns.get_level_values("Region") pet_vals = df.columns.get_level_values("Pet") # 匹配生成Kind层级的取值 kind_vals = [pet_kind_dict[pet] for pet in pet_vals] # 组装新的三层MultiIndex new_cols = pd.MultiIndex.from_arrays( arrays=[region_vals, pet_vals, kind_vals], names=["Region", "Pet", "Kind"] ) # 替换原DataFrame的列 df.columns = new_cols
- 最终输出结果完全匹配预期结构:
Region Region1 Region2 Pet Cat Dog Cat Dog Kind Tabby Weiner Tabby Weiner 0 1 8 5 9 1 4 3 7 1
检索提示
之前搜不到对应方案是因为术语偏差:这个操作不属于表合并/拼接(merge/concat/join)范畴,属于pandas MultiIndex层级扩展,后续可以用这个关键词检索相关场景的方案。
内容的提问来源于stack exchange,提问作者Jnams
相关产品推荐
相关产品推荐

