如何在Pandas DataFrame中将多列转换为多行?
解决Pandas宽表转长表:合并季度列并复制关联字段
看起来你需要把宽格式的DataFrame转换成窄格式(也就是“融化”数据),Pandas的melt()函数正好能完美解决这个问题。我先帮你梳理步骤,直接上可运行的代码:
首先,先构造你给出的原始DataFrame(我修正了输入里的格式问题,确保数据对应正确):
import pandas as pd # 原始数据构造 raw_data = { 'Deal': ['h', 'i', 'j'], 'Year': [1991, 1992, 1993], 'Quarter_1': [1, 4, 7], 'Quarter_2': [2, 5, 8], 'Quarter_3': [3, 6, 9], 'Financial_Data': [120, 80, 100] } df = pd.DataFrame(raw_data)
接下来用melt()函数完成转换:
# 执行宽转长操作 result_df = pd.melt( df, # 指定需要保留并复制的核心字段 id_vars=['Deal', 'Year', 'Financial_Data'], # 指定需要合并成单行的季度列 value_vars=['Quarter_1', 'Quarter_2', 'Quarter_3'], # 给新生成的季度值列命名 value_name='Quarter' ).drop('variable', axis=1) # 删除自动生成的原列名列(不需要的话可以去掉) # 可选:重置索引,让结果更整洁 result_df = result_df.reset_index(drop=True) print(result_df)
运行后得到的结果就是你想要的格式(注意你给出的示例结果里Deal列的i/j/k应该是笔误,正确结果里每个原始Deal会对应3条记录,比如h会出现3次,分别对应季度1、2、3):
| Deal | Year | Financial_Data | Quarter |
|---|---|---|---|
| h | 1991 | 120 | 1 |
| i | 1992 | 80 | 4 |
| j | 1993 | 100 | 7 |
| h | 1991 | 120 | 2 |
| i | 1992 | 80 | 5 |
| j | 1993 | 100 | 8 |
| h | 1991 | 120 | 3 |
| i | 1992 | 80 | 6 |
| j | 1993 | 100 | 9 |
关键参数解释
id_vars:指定哪些列需要保持原样,不参与重塑,也就是你要复制的Deal、Year和Financial_Data。value_vars:指定哪些列需要被“融化”成单行数据,这里就是三个季度列。value_name:给新生成的包含季度值的列起名字,也就是你要的Quarter。
如果需要调整结果的排序,比如按Deal和Quarter排序,可以再加一行:
result_df = result_df.sort_values(by=['Deal', 'Quarter']).reset_index(drop=True)
内容的提问来源于stack exchange,提问作者Elias K.
相关产品推荐
相关产品推荐

