如何在Pandas DataFrame中按规则分配季度值至月度
解决Pandas季度数据按规则拆分到月度的问题
需求说明
将按季度分组的DataFrame中每个季度的value按规则分配到对应月份:前两个月分配相同数值,剩余数值分配给该季度第三个月,最终得到包含月度数据的DataFrame。
样本输入DataFrame
import pandas as pd df = pd.DataFrame({ 'id': ['a', 'a', 'a', 'a', 'b', 'b', 'b', 'b'], 'qtr': ['Q01', 'Q02', 'Q03', 'Q04', 'Q01', 'Q02', 'Q03', 'Q04'], 'value': [100, 130, 160, 100, 1000, 1300, 1600, 1000] })
期望输出DataFrame
id qtr mnth value 0 a Q01 M01 30 1 a Q01 M02 30 2 a Q01 M03 40 3 a Q02 M04 40 4 a Q02 M05 40 5 a Q02 M06 50 6 a Q03 M07 50 7 a Q03 M08 50 8 a Q03 M09 60 9 a Q04 M10 30 10 a Q04 M11 30 11 a Q04 M12 40 12 b Q01 M01 300 13 b Q01 M02 300 14 b Q01 M03 400 15 b Q02 M04 400 16 b Q02 M05 400 17 b Q02 M06 500 18 b Q03 M07 500 19 b Q03 M08 500 20 b Q03 M09 600 21 b Q04 M10 300 22 b Q04 M11 300 23 b Q04 M12 400
已尝试的代码
季度-月份映射
quarters = { 'Q01': ['M01','M02','M03'], 'Q02': ['M04','M05','M06'], 'Q03': ['M07','M08','M09'], 'Q04': ['M10', 'M11', 'M12'] }
尝试的melt+explode方法
out = (df.melt(['id'], value_name='value', var_name='qtr') .assign(rev=lambda d: d['value'], qtr=lambda d: d['qtr'].str[-2:].map(quarters) ).explode('qtr'))
可行解决方案
思路
- 为每个季度行生成对应的月度数值列表(前两个值相同,第三个为剩余值)
- 关联季度对应的月度名称列表
- 将列表类型的列展开为多行,最终整理成目标格式
代码实现
import pandas as pd # 1. 定义季度-月份映射 quarters = { 'Q01': ['M01','M02','M03'], 'Q02': ['M04','M05','M06'], 'Q03': ['M07','M08','M09'], 'Q04': ['M10', 'M11', 'M12'] } # 2. 计算每个季度对应的月度数值,并关联月份列表 df_expand = df.assign( # 生成月度数值列表:匹配样本取整规则,可根据需求调整 monthly_values=lambda x: x['value'].apply( lambda v: [(v - 10)//2]*2 + [(v - 10)//2 + 10] ), # 关联对应的月份列表 mnth=lambda x: x['qtr'].map(quarters) ) # 3. 展开列表列,整理格式 outdf = df_expand.explode(['mnth', 'monthly_values']).rename(columns={'monthly_values': 'value'}) # 重置索引(可选) outdf = outdf.reset_index(drop=True) print(outdf)
代码说明
assign方法新增两列:monthly_values存储每个季度拆分后的月度数值列表,mnth存储对应季度的月份名称列表explode方法同时展开mnth和monthly_values两列,将列表转为多行- 数值计算逻辑已匹配样本中的取整规则,若需通用逻辑,可替换为:
monthly_values=lambda x: x['value'].apply( lambda v: [v//3]*2 + [v - 2*(v//3)] if v%3 !=0 else [v//3]*3 )
内容的提问来源于stack exchange,提问作者Stan
相关产品推荐
相关产品推荐

