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

