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

Pandas多级融合:将宽表转换为含YYYYMM格式的长表

没问题,这就帮你搞定这个DataFrame的格式转换需求!咱们一步步来实现:

第一步:先确认原始数据

首先先把你的原始代码放出来,方便对照:

import pandas as pd

d = {'PN': [10506,10506,10507,10507], 'Year': [2017, 2018, 2017, 2018], '01': [1,2,3,4], '02': [5,6,7,8], '03': [9,10,11,12]}
indata = pd.DataFrame(data = d)

此时indata的结构是宽格式:

PN  Year  01  02  03
0  10506  2017   1   5   9
1  10506  2018   2   6  10
2  10507  2017   3   7  11
3  10507  2018   4   8  12

第二步:转换为长格式并合并年月

我们可以用Pandas的melt()方法把宽格式转成长格式,再合并年份和月份得到YYYYMM格式的YearMonth列:

# 1. 转长格式:保留PN和Year作为标识列,把月份列转为行
melted_df = pd.melt(indata, id_vars=['PN', 'Year'], var_name='Month', value_name='Qty')

# 2. 合并Year和Month为YYYYMM格式
melted_df['YearMonth'] = melted_df['Year'].astype(str) + melted_df['Month']

# 3. 调整列顺序,只保留需要的三列
final_df = melted_df[['PN', 'YearMonth', 'Qty']]

最终结果

运行上面的代码后,final_df就是你想要的结构:

PN YearMonth  Qty
0  10506     201701    1
1  10506     201801    2
2  10507     201701    3
3  10507     201801    4
4  10506     201702    5
5  10506     201802    6
6  10507     201702    7
7  10507     201802    8
8  10506     201703    9
9  10506     201803   10
10 10507     201703   11
11 10507     201803   12

简洁写法(一行搞定)

如果喜欢更紧凑的代码,可以用链式调用把步骤合并:

final_df = (pd.melt(indata, id_vars=['PN', 'Year'], var_name='Month', value_name='Qty')
            .assign(YearMonth=lambda x: x['Year'].astype(str) + x['Month'])
            .loc[:, ['PN', 'YearMonth', 'Qty']])

注意:这里你的月份列已经是两位的字符串('01'、'02'),所以直接拼接就没问题。如果后续月份是单数字(比如'1'),可以用x['Month'].str.zfill(2)来补零,保证格式统一。

内容的提问来源于stack exchange,提问作者Marcus Högenå Bohman

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 08:09:17