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

使用Pandas转换带有隐式分类表头的数据

Pandas转换带有隐式分类表头的数据

我来帮你解决这个问题!你的原始表格是带有双层表头(年份和分类A/B)的宽表,要转成目标的长表格式,关键是先把双层表头正确识别为MultiIndex,再通过melt或stack来重构数据。下面是具体的实现步骤:

1. 先构造/读取原始数据

如果你是手动构造示例数据,可以这样创建带双层列索引的DataFrame:

import pandas as pd

data = [[1, 2, 3, 4], [5, 6, 7, 8]]
# 创建双层列索引,对应年份和分类(A/B)
columns = pd.MultiIndex.from_tuples(
    [('2022', 'A'), ('2022', 'B'), ('2021', 'A'), ('2021', 'B')],
    names=['year', 'category']
)
df = pd.DataFrame(data, index=['X', 'Y'], columns=columns)

如果是从CSV等文件读取,记得指定读取双层表头:

df = pd.read_csv('your_data.csv', header=[0, 1], index_col=0)

2. 转换为目标长表格式

这里提供两种常用方法:

方法一:使用pd.melt

# 先把行索引(X/Y)转成名为'class'的列
df = df.rename_axis('class').reset_index()

# 用melt拆分双层列索引,指定新列名
result = df.melt(
    id_vars='class', 
    var_name=['year', 'category'], 
    value_name='value'
)

# 调整列顺序并排序,匹配目标格式
result = result[['year', 'category', 'class', 'value']]\
           .sort_values(by=['year', 'category'], ascending=[False, True])\
           .reset_index(drop=True)

方法二:使用stack(更简洁)

# 给行索引命名为'class'
df = df.rename_axis('class')

# 把双层列索引堆叠成行索引,再重置为普通列
result = df.stack([0, 1]).reset_index(name='value')

# 调整列的顺序并排序
result.columns = ['class', 'year', 'category', 'value']
result = result[['year', 'category', 'class', 'value']]\
           .sort_values(by=['year', 'category'], ascending=[False, True])\
           .reset_index(drop=True)

运行后result就是你想要的格式:

year category class  value
0  2022        A     X      1
1  2022        A     Y      5
2  2022        B     X      2
3  2022        B     Y      6
4  2021        A     X      3
5  2021        A     Y      7
6  2021        B     X      4
7  2021        B     Y      8

备注:内容来源于stack exchange,提问作者symbolrush

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 15:23:02