如何将Pandas单表头DataFrame转换为多层列索引?
将单表头DataFrame转换为带ID映射的多层列索引DataFrame
需求说明
需要把单表头的Pandas DataFrame转换成多层列索引格式:
- 非ID类列(示例中的
A列)保留为第一列,上层表头为空、下层为列名 - ID类列对应另一DataFrame中的名称作为上层表头,原ID作为下层表头
- 最终列顺序需匹配指定的名称排列
示例数据
import pandas as pd import numpy as np # 构造基础数据列 df = pd.DataFrame({"A": ['fay','fee','fie','foe']}) # 构造ID类数值列 df1 = pd.DataFrame(np.random.randint(0,10,size=(4,4)), columns=['012','015','016','018']) # 合并得到单表头DataFrame df1 = pd.merge(df, df1, right_index=True, left_index=True) # 存储ID与对应名称的映射表 df2 = pd.DataFrame({'id':['018','015','012','016'], 'name':['boom','bing', 'bota','bada']}) dict_id = dict(zip(df2.id, df2.name))
实现步骤
- 定义目标列顺序:按照期望的名称排列,对应到原ID列的顺序
# 对应目标表头的bota、bing、bada、boom,对应的ID依次是012、015、016、018 target_id_order = ['012', '015', '016', '018']
- 构造多层列索引元组
- 为非ID列
A生成层级元组:('', 'A'),对应上层空表头、下层列名 - 为ID列生成
(名称, ID)的元组,基于映射字典和目标顺序
# 非ID列的多层索引 non_id_cols = [('', 'A')] # ID列的多层索引 id_multi_cols = [(dict_id[id], id) for id in target_id_order] # 合并所有列的多层索引 multi_columns = non_id_cols + id_multi_cols
- 重新设置列顺序与多层索引
# 调整df1的列顺序,确保和目标一致 df1 = df1[['A'] + target_id_order] # 设置多层列索引 df1.columns = pd.MultiIndex.from_tuples(multi_columns)
最终效果
执行后df1的结构如下:
bota bing bada boom A 012 015 016 018 0 fay 0 3 1 5 1 fee 1 2 9 7 2 fie 5 1 0 3 3 foe 0 7 8 5
内容的提问来源于stack exchange,提问作者Shane S
相关产品推荐
相关产品推荐

