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

Pandas如何组合DataFrame行索引与列名转换为指定长表结构

DataFrame宽表转指定长表结构实现方案

你需要的是把行索引为年份、列名为季度的宽格式EPS表,转换为「年份+季度」为单一维度的长表,不需要调用MultiIndex或者itertools相关逻辑,用pandas原生的重塑方法即可实现。

初始数据确认

初始df结构如下:

print(df)
         Q1     Q2     Q3     Q4
2008  18.19  19.78  17.49   5.62
2009  12.83  16.03  16.36  16.80
2010  19.71  21.48  21.75  22.55

方法1:用stack实现(推荐,顺序自动对齐)

stack()会自动把列索引(季度)下沉为二级行索引,天然按「年份→季度」的顺序排列,不需要额外排序:

# 列转行得到多层索引的序列
s = df.stack()
# 重置索引后重命名列
df1 = s.reset_index()
df1.columns = ['年份', '季度', 'EPS']
# 拼接Year字段,筛选目标列
df1['Year'] = df1['年份'].astype(str) + df1['季度']
df1 = df1[['Year', 'EPS']].reset_index(drop=True)

方法2:用melt实现

melt是pandas专门用于宽转长的API,注意最后需要按Year字段排序来匹配目标顺序:

df1 = df.melt(ignore_index=False, var_name='季度', value_name='EPS')\
        .reset_index(names='年份')
df1['Year'] = df1['年份'].astype(str) + df1['季度']
df1 = df1[['Year', 'EPS']].sort_values('Year').reset_index(drop=True)

两种方法运行后打印df1,输出结果和目标结构完全一致:

print(df1)
      Year    EPS
0   2008Q1  18.19
1   2008Q2  19.78
2   2008Q3  17.49
3   2008Q4   5.62
4   2009Q1  12.83
5   2009Q2  16.03
6   2009Q3  16.36
7   2009Q4  16.80
8   2010Q1  19.71
9   2010Q2  21.48
10  2010Q3  21.75
11  2010Q4  22.55

内容的提问来源于stack exchange,提问作者Gerry

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 04:45:48