如何在pandas中基于周数高效生成双周及月度分组标签
优化方案说明
你目前使用的逐行apply加条件判断的实现方式存在两个明显问题:一是数据量较大时性能极低,二是现有逻辑遗漏了Week=1的处理,会返回空值不符合「1、2周标注为2」的规则。
可以直接用pandas向量化运算实现需求,全程不需要自定义函数和逐行判断,不仅能覆盖全年52周的所有场景,性能还能提升几十到上百倍。
双周列计算
按照规则(1、2周标2,3、4周标4,以此类推),直接用整数除法即可实现:
prof_calc['Bi-Weekly'] = ((prof_calc['Week'] + 1) // 2 * 2).astype(int)
数值验证:
- Week=1:(1+1)//2=1 → 1*2=2 符合要求
- Week=2:(2+1)//2=1 → 1*2=2 符合要求
- Week=3:(3+1)//2=2 → 2*2=4 符合要求
- Week=52:(52+1)//2=26 → 26*2=52 符合要求
月度列计算
按照1-4周归属为月份1的规则,计算逻辑如下:
prof_calc['Monthly'] = ((prof_calc['Week'] - 1) // 4 + 1).astype(int)
数值验证:
- Week=4:(4-1)//4=0 → 0+1=1 符合要求
- Week=5:(5-1)//4=1 →1+1=2 符合要求
- Week=52:(52-1)//4=12 →12+1=13 符合4周为1个统计月的规则
完整测试代码
import pandas as pd # 构造示例数据 data = { 'ID': ['A', 'A', 'A', 'A'], 'Week': [1, 2, 3, 4], 'Profit': [2, 2, 0, 0] } prof_calc = pd.DataFrame(data) # 新增两列 prof_calc['Bi-Weekly'] = ((prof_calc['Week'] + 1) // 2 * 2).astype(int) prof_calc['Monthly'] = ((prof_calc['Week'] - 1) // 4 + 1).astype(int) # 分组统计示例 # 按双周统计利润 biweek_profit = prof_calc.groupby(['ID', 'Bi-Weekly'])['Profit'].sum().reset_index() # 按月度统计利润 monthly_profit = prof_calc.groupby(['ID', 'Monthly'])['Profit'].sum().reset_index()
内容的提问来源于stack exchange,提问作者Michelle Kempis
相关产品推荐
相关产品推荐

