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

如何在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'))

可行解决方案

思路

  1. 为每个季度行生成对应的月度数值列表(前两个值相同,第三个为剩余值)
  2. 关联季度对应的月度名称列表
  3. 将列表类型的列展开为多行,最终整理成目标格式

代码实现

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 10:44:54