如何用优雅高效的Pandas代码拆分季度营收至月度并重塑DataFrame
高效实现Pandas季度营收拆分并重塑为月度数据
原始DataFrame
import pandas as pd df1 = pd.DataFrame({ 's_id': [18,23], 'SUB':['Phy','Phy'], 'Rev_Q1':[80,100], 'Rev_Q2':[60,50], 'Rev_Q3':[20,12], 'Rev_Q4':[10,12] })
需求
- 将每个季度的营收等额拆分到该季度的3个月份中(例如
s_id=18的Rev_Q1值80,除以3后得到26.667,分配给1、2、3月) - 将数据重塑为月度列转成行的格式
优雅高效实现方案
通过Pandas原生方法组合完成,避免冗余手动操作:
# 1. 把季度营收列转成长表,保留s_id和SUB作为标识列 melted = df1.melt(id_vars=['s_id', 'SUB'], var_name='Quarter', value_name='Rev') # 2. 提取季度数字,生成对应季度的3个月份列表 melted['Quarter_num'] = melted['Quarter'].str.extract('Q(\d+)').astype(int) melted['Month'] = melted['Quarter_num'].apply(lambda x: list(range(3*x-2, 3*x+1))) # 3. 扩展行拆分月份,同时计算月度营收 result = melted.explode('Month').assign(Rev_Month=lambda x: x['Rev']/3).round(3) # 4. 整理列顺序并排序 result = result[['s_id', 'SUB', 'Month', 'Rev_Month']].sort_values(['s_id', 'Month']).reset_index(drop=True)
输出结果示例
s_id SUB Month Rev_Month 0 18 Phy 1 26.667 1 18 Phy 2 26.667 2 18 Phy 3 26.667 3 18 Phy 4 20.000 4 18 Phy 5 20.000 5 18 Phy 6 20.000 6 18 Phy 7 6.667 7 18 Phy 8 6.667 8 18 Phy 9 6.667 9 18 Phy 10 3.333 10 18 Phy 11 3.333 11 18 Phy 12 3.333 12 23 Phy 1 33.333 13 23 Phy 2 33.333 14 23 Phy 3 33.333 15 23 Phy 4 16.667 16 23 Phy 5 16.667 17 23 Phy 6 16.667 18 23 Phy 7 4.000 19 23 Phy 8 4.000 20 23 Phy 9 4.000 21 23 Phy 10 4.000 22 23 Phy 11 4.000 23 23 Phy 12 4.000
方案优势
- 全程使用Pandas原生方法,无需手动创建冗余列,代码简洁易维护
melt+explode组合高效完成宽表转长表+行扩展操作- 逻辑分层清晰,每一步对应需求环节,可读性强
内容的提问来源于stack exchange,提问作者The Great
相关产品推荐
相关产品推荐

