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

请求协助重塑Pandas DataFrame:从指定源格式转换为目标格式

解决Pandas复合表头DataFrame的重塑问题

先看你的源DataFrame,这是典型的复合表头+宽格式数据:前两行定义了后面数值列的分组(A/B)和日期,第三、四行是对应Clasif1(PRE/POST)和Currency的数值。我们需要把它转成标准的长格式,让每个Clasif1条目对应一条分组、日期、数值的记录。

下面是分步实现的代码:

1. 准备源数据并提取表头信息

先明确数据结构:前两行是后面数值列的元数据(分组和日期),第三、四行是实际观测数据。

import pandas as pd
import numpy as np

# 源DataFrame
df = pd.DataFrame({
    'Clasif1': [np.NaN, np.NaN, 'PRE', 'POST'],
    'Currency': [np.NaN, np.NaN, 'LC', 'USD'],
    'Unnamed: 1': ['A','01/01/2018',1,7],
    'Unnamed: 2': ['A','02/01/2018',2,8],
    'Unnamed: 3': ['A','03/01/2018',3,9],
    'Unnamed: 4': ['B','01/01/2018',4,10],
    'Unnamed: 5': ['B','02/01/2018',5,11],
    'Unnamed: 6': ['B','03/01/2018',6,12]
})

# 提取后面数值列的分组(A/B)和日期信息
groups = df.iloc[0, 2:].tolist()
dates = df.iloc[1, 2:].tolist()

# 取出实际的观测数据行(第三、四行),重置索引
df_data = df.iloc[2:].reset_index(drop=True)

2. 重塑宽格式为长格式

用pd.melt把宽格式的数值列转成长格式,再把之前提取的分组和日期信息合并进去:

# 把数值列转成长格式
df_melted = df_data.melt(
    id_vars=['Clasif1', 'Currency'],
    value_name='Value'
)

# 添加分组和日期列(重复对应每一行观测数据)
df_melted['Group'] = groups * len(df_data)
df_melted['Date'] = dates * len(df_data)

# 调整列顺序,删除不需要的原列名
df_result = df_melted.drop(columns=['variable'])[['Clasif1', 'Currency', 'Group', 'Date', 'Value']]

3. 查看最终结果

现在df_result就是你需要的结构,前几行输出如下:

Clasif1 Currency Group        Date Value
0     PRE       LC     A  01/01/2018     1
1    POST       USD     A  01/01/2018     7
2     PRE       LC     A  02/01/2018     2
3    POST       USD     A  02/01/2018     8
4     PRE       LC     A  03/01/2018     3
5    POST       USD     A  03/01/2018     9
...

简单解释下逻辑:

  • 先剥离前两行的元数据(分组、日期),因为它们是每个数值列的标识
  • 用melt把每行的多个数值列拆成多行,保留Clasif1和Currency作为分组变量
  • 最后把元数据对应到每一行,得到标准的长格式数据,方便后续分析或可视化

内容的提问来源于stack exchange,提问作者Cristian Saavedra Desmoineaux

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 10:09:35