Python Pandas多级列索引处理:将表头第一层级设置为行索引
Pandas多级列头宽表转长表实现方案
实现思路
你的需求是将带多级列头的宽格式表转为行维度上展开的长格式表,核心通过stack方法将多级列头的上层维度从列侧移动到行侧,再重置索引转为普通列即可实现。
完整可运行代码
import pandas as pd import numpy as np # -------------------------- # 以下为模拟原始数据的构造代码,实际使用时替换为你自己的df即可 # -------------------------- columns = pd.MultiIndex.from_product( [["2021", "2022", "2023"], ["销售额", "利润", "销量"]], names=["年份", "指标"] ) index = ["华东", "华北", "华南", "西南"] df = pd.DataFrame(np.random.randint(100, 1000, size=(4, 9)), index=index, columns=columns) print("原始数据预览:") print(df.head()) # -------------------------- # 核心转换代码 # -------------------------- # 给多级列头设置层级名,若你的列头已经有名称可跳过此步 df.columns.names = ["上层列名", "下层列名"] # 将上层列头堆叠到行维度,这里level参数填你要移动的列层级的名称或者序号(最顶层为0) df = df.stack(level="上层列名").reset_index() # 可选:调整列顺序为你需要的目标顺序,列名替换为你实际的字段名 df = df.reindex(columns=["level_0", "上层列名", "销售额", "利润", "销量"]) # 可选:重命名列名,替换为你实际的业务名称 df = df.rename(columns={"level_0": "地区", "上层列名": "年份"}) print("\n转换后数据预览:") print(df.head())
参数调整说明
- 如果你的多级列头超过2层,可多次调用
stack方法,或者传入level参数为列表一次性移动多个层级 - 如果你原始表的行索引是默认的自增数字无业务含义,可先执行
df = df.reset_index()再做堆叠操作 - 如果需要保留原始空值对应的行,可在
stack方法中添加dropna=False参数:df.stack(level="上层列名", dropna=False)
内容的提问来源于stack exchange,提问作者TG_01
相关产品推荐
相关产品推荐

