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

如何将带复合表头的Pandas DataFrame转换为规范表格?

Pandas DataFrame 格式转换解决方案

需求说明

需要将如下格式的DataFrame:

index01234...
0parameter2001200120022002...
1lowhighlowhigh...
2foo1278...
3barNaNNaN1213...

转换为:

indexparameteryearlowhigh...
0foo200112...
1foo200278...
2bar20021213...

完整转换代码

import pandas as pd
import numpy as np

data = {
    0: ['parameter', '', 'foo', 'bar'],
    1: [2001, 'low', 1, np.nan],
    2: [2001, 'high', 2, np.nan],
    3: [2002, 'low', 7, 12],
    4: [2002, 'high', 8, 13],
}

df = pd.DataFrame(data)

# 1. 构建列的MultiIndex:年份 + 高低值层级
year_level = df.iloc[0, 1:].values  # 提取第一行的年份数据(跳过第一列)
type_level = df.iloc[1, 1:].values  # 提取第二行的low/high标识
multi_cols = pd.MultiIndex.from_arrays([year_level, type_level], names=['year', 'type'])

# 2. 清理数据主体,匹配新列名
df_clean = df.iloc[2:]  # 保留实际参数和数值行
df_clean.columns = ['parameter'] + list(multi_cols)

# 3. 宽表转长表后透视,得到目标格式
df_melted = df_clean.melt(id_vars='parameter', var_name=['year', 'type'], value_name='value')
df_melted = df_melted.dropna(subset=['value'])  # 移除空值行
df_result = df_melted.pivot_table(index=['parameter', 'year'], columns='type', values='value', aggfunc='first').reset_index()

# 整理最终格式
df_result.columns.name = None
df_result = df_result[['parameter', 'year', 'low', 'high']]

print(df_result)

关键步骤说明

  • 构建多层列索引:用原始表前两行的年份、高低值标识作为列的层级,明确每列数据的含义。
  • 数据主体清理:跳过表头行,给剩余数据匹配新的列名体系。
  • 宽转长+透视:通过melt将多列的年份和类型拆分为行数据,再用pivot_table将low/high转为独立列,自动过滤空值后得到目标结构。

内容的提问来源于stack exchange,提问作者Wasserwaage

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 17:55:18