使用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
相关产品推荐
相关产品推荐

