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

Pandas如何按指定顺序透视DataFrame得到连续季度目标格式表

问题原因

你用错了转换函数:pivot的作用是长表转宽表,和你当前「宽格式季度数据转长格式」的需求方向完全相反。你需要的是逆透视(宽转长)操作,再做字段拆分、结构调整即可得到目标格式。
另外注意你的原始列名存在命名不统一的问题:Q122con_s/Q222con_s这类列名在季度和指标名之间缺少下划线,提取字段时需要做兼容处理。

实现代码
import pandas as pd

# 读取/构造你的原始数据
df = pd.DataFrame({
    'ID': ['AA', 'BB'],
    'Q122_c_en': [900, 1000],
    'Q122con_s': [89, 10],
    'Q222_c_en': [1000, 1000],
    'Q222con_s': [90, 20],
    'Q322_c_en': [1200, 1100],
    'Q322con_s': [92, 25],
    'Q422_c_en': [1000, 1300],
    'Q422con_s': [90, 30]
})

# 步骤1:宽表转长表,把所有季度列打平成行
long_df = df.melt(id_vars='ID', var_name='raw_col', value_name='val')

# 步骤2:从原始列名中拆分季度、指标名称
# 列名前4位固定为季度标识(如Q122),剩余部分去掉开头下划线即为指标名
long_df['Date'] = long_df['raw_col'].str[:4]
long_df['metric'] = long_df['raw_col'].str[4:].str.lstrip('_')

# 步骤3:把指标维度转回列,得到最终结构
result = long_df.pivot(index=['ID', 'Date'], columns='metric', values='val').reset_index()

# 步骤4:排序保证季度按顺序排列,调整列顺序匹配要求
result = result.sort_values(by=['ID', 'Date'], ignore_index=True)[['ID', 'Date', 'con_en', 'con_s']]
运行结果

执行后输出完全匹配你的期望格式:

ID Date  con_en  con_s
0  AA Q122     900     89
1  AA Q222    1000     90
2  AA Q322    1200     92
3  AA Q422    1000     90
4  BB Q122    1000     10
5  BB Q222    1000     20
6  BB Q322    1100     25
7  BB Q422    1300     30
补充说明
  • 季度排序逻辑:当前季度命名格式为Q+季度序号+两位年份,字符串默认排序即可满足Q1→Q2→Q3→Q4的顺序要求。如果后续数据存在跨年场景(如Q422后接Q123),需要单独拆分年份、季度序号转成数值后排序,避免字符串排序导致Q123排在Q422前面的问题。
  • 如果后续你统一了列名格式,所有季度和指标名之间都有下划线(如Q122_con_s),可以直接用pd.wide_to_long简化代码:
# 列名统一为{季度}_{指标名}格式时的简化写法
result = pd.wide_to_long(
    df,
    stubnames=['con_en', 'con_s'],
    i='ID',
    j='Date',
    sep='_',
    suffix=r'Q\d+'
).reset_index().sort_values(by=['ID', 'Date'], ignore_index=True)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 05:57:17