如何识别连续3个月销售达标行并填充一致性列
解决方案:实现达标后重置的连续3个月销售额计数
问题分析
你之前用rolling(window=3).sum()的方法,只能计算固定窗口内的达标次数,但无法处理达标后重置计数器或者中途不达标直接重置的逻辑——这种带状态的逐行计算,需要自定义迭代逻辑来实现。
步骤1:构造示例数据
先模拟一个包含salesperson_id、Month、sales的DataFrame,方便测试:
import pandas as pd data = { 'salesperson_id': [1,1,1,1,1,1,1,2,2,2,2,2], 'Month': ['2023-01','2023-02','2023-03','2023-04','2023-05','2023-06','2023-07','2023-01','2023-02','2023-03','2023-04','2023-05'], 'sales': [260,270,280,260,240,290,300,250,250,240,260,270] } df = pd.DataFrame(data)
步骤2:自定义分组处理函数
写一个函数,对每个销售的行数据逐行处理,维护一个计数器:
- 初始化计数器
count = 0 - 遍历每一行:
- 如果当前销售额≥250:计数器+1;如果计数器达到3,标记获奖并重置计数器为0
- 如果当前销售额<250:计数器重置为0,不标记获奖
- 返回处理后的结果列
def calculate_consistency(group): # 初始化计数器和结果列表 count = 0 consistency = [] for sale in group['sales']: if sale >= 250: count += 1 # 达标3个月,标记获奖并重置计数器 if count == 3: consistency.append('获奖') count = 0 else: consistency.append(count) else: # 销售额不达标,重置计数器 count = 0 consistency.append(0) group['3 month consistency'] = consistency return group
步骤3:应用函数到分组数据
按salesperson_id分组后,应用上面的函数:
df = df.groupby('salesperson_id').apply(calculate_consistency).reset_index(drop=True)
结果验证
处理后的DataFrame会得到符合预期的3 month consistency列:
| salesperson_id | Month | sales | 3 month consistency |
|---|---|---|---|
| 1 | 2023-01 | 260 | 1 |
| 1 | 2023-02 | 270 | 2 |
| 1 | 2023-03 | 280 | 获奖 |
| 1 | 2023-04 | 260 | 1 |
| 1 | 2023-05 | 240 | 0 |
| 1 | 2023-06 | 290 | 1 |
| 1 | 2023-07 | 300 | 2 |
| 2 | 2023-01 | 250 | 1 |
| 2 | 2023-02 | 250 | 2 |
| 2 | 2023-03 | 240 | 0 |
| 2 | 2023-04 | 260 | 1 |
| 2 | 2023-05 | 270 | 2 |
这个结果完全符合你的规则:
- 连续3个月达标时标记「获奖」,之后计数器重置
- 任何一个月销售额低于250,计数器直接重置为0
内容的提问来源于stack exchange,提问作者Karthik Kumar
相关产品推荐
相关产品推荐

