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

如何在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):

DealYearFinancial_DataQuarter
h19911201
i1992804
j19931007
h19911202
i1992805
j19931008
h19911203
i1992806
j19931009

关键参数解释

  • 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.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:42:34