如何使用Pandas将DataFrame转换为指定堆叠格式?
问题与解决方案:Pandas DataFrame指定堆叠格式转换
问题描述
原始DataFrame:
Prod ProdDesc tot avg qtr val_qtr A Cyl 110 8.7 202301 12 A Cyl 110 8.7 202302 56.9 A Cyl 110 8.7 202303 9 A Cyl 110 8.7 202304 0
尝试使用melt方法:
df_tra = df.melt(id_vars=['Prod', 'ProdDesc'], var_name='Attrib', value_name='Value') df_tra.drop_duplicates()
得到的结果不符合预期:
Prod ProdDesc Attrib Value A Cyl tot 110 A Cyl avg 8.7 A Cyl qtr 202301 A Cyl qtr 202302 A Cyl qtr 202303 A Cyl qtr 202304 A Cyl val_qtr 12 A Cyl val_qtr 56.9 A Cyl val_qtr 9 A Cyl val_qtr 0
期望得到的格式:
df_actual_wanted Prod ProdDesc Attrib Value A Cyl tot 110 A Cyl avg 8.7 A Cyl 202301 12 A Cyl 202302 56.9 A Cyl 202303 9 A Cyl 202304 0
解决方案
核心思路是拆分处理两类数据:静态属性(tot、avg,所有行值相同)和季度数据(qtr作为属性名,val_qtr作为对应值),再合并结果:
import pandas as pd # 处理静态属性:tot和avg,去重后转成目标格式 static_attrs = df[['Prod', 'ProdDesc', 'tot', 'avg']].drop_duplicates() part1 = static_attrs.melt(id_vars=['Prod', 'ProdDesc'], var_name='Attrib', value_name='Value') # 处理季度数据:直接重命名列,将qtr作为属性名,val_qtr作为对应值 part2 = df[['Prod', 'ProdDesc', 'qtr', 'val_qtr']].rename(columns={'qtr': 'Attrib', 'val_qtr': 'Value'}) # 合并两部分,重置索引 df_actual_wanted = pd.concat([part1, part2], ignore_index=True)
代码说明
- 静态属性处理:由于
tot和avg在所有行中值一致,先通过drop_duplicates()保留唯一记录,再用melt转成Attrib-Value格式。 - 季度数据处理:直接将
qtr列重命名为Attrib,val_qtr重命名为Value,得到季度对应的键值对。 - 合并结果:用
pd.concat()将两部分数据合并,ignore_index=True重置索引以避免重复。
运行后即可得到期望的DataFrame格式。
内容的提问来源于stack exchange,提问作者Stan
相关产品推荐
相关产品推荐

