请求协助重塑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
相关产品推荐
相关产品推荐

