如何按cond条件分段重置计算pandas df.cummin()累积最小值
pandas按条件触发分段累积最小值计算实现
需求说明
- 计算规则:
cond列取值为True时重置分段,从当前行开始对A列执行cummin()累积最小值计算,直到下一次cond为True时再次重置分段,最终结果存入expected列 - 首次出现
cond=True之前的行不启动计算,对应expected值留空
测试输入代码
import pandas as pd import numpy as np A=[17,18,21,15,18,19,22,16,30,50,] cond=[False,True,False,False,False,True,False,False,True,False] df=pd.DataFrame({'A':A,'cond':cond})
实现代码
核心思路是先通过cond列的累加值生成分组标记,再按分组执行组内累积最小值计算,最后处理前置空值行即可:
# 生成分组ID:每次cond为True时分组号+1,同分段共享同一ID df['group_id'] = df['cond'].cumsum() # 按分组计算组内累积最小值 df['expected'] = df.groupby('group_id')['A'].cummin() # 首次cond=True之前的行(group_id=0)赋值为空,符合需求 df.loc[df['group_id'] == 0, 'expected'] = np.nan # 清理临时列 df = df.drop(columns='group_id')
预期输出结果
运行代码后得到的结果完全匹配要求:
| 索引 | A | cond | expected |
|---|---|---|---|
| 0 | 17 | FALSE | NaN |
| 1 | 18 | TRUE | 18 |
| 2 | 21 | FALSE | 18 |
| 3 | 15 | FALSE | 15 |
| 4 | 18 | FALSE | 15 |
| 5 | 19 | TRUE | 19 |
| 6 | 22 | FALSE | 19 |
| 7 | 16 | FALSE | 16 |
| 8 | 30 | TRUE | 30 |
| 9 | 50 | FALSE | 30 |
逻辑说明
- 布尔值做累加运算时,
True等价于1、False等价于0,因此cond.cumsum()可以天然实现“每次遇到True就切新分组”的标记效果 - 该实现为pandas原生向量化运算,无逐行循环,大数据量下性能表现优异
- 如果需要调整为累积最大值、累积求和等其他分段聚合逻辑,只需要把
cummin()替换为对应的cummax()、cumsum()即可
内容的提问来源于stack exchange,提问作者July
相关产品推荐
相关产品推荐

