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
相关产品推荐
相关产品推荐

