如何在start与end条件区间内计算最小值并填充result列
问题:计算指定区间内A列最小值并赋值给result列
需求说明
当start列值为True时开启一个区间,end列值为True时结束该区间,计算区间内A列的最小值,并将结果赋值给result列(区间结束后的行需继承该最小值,直到下一个新区间开启)。
输入代码
import pandas as pd import numpy as np A = [6, 12, 21, 15, 18, 19, 13, 9, 10, 50] cond1 = [False, True, False, False, False, False, True, False, False, False] cond2 = [False, False, False, True, False, False, False, False, True, False] df = pd.DataFrame({'A' : A, 'start' : cond1, 'end' : cond2})
预期输出
A start end result 0 6 False False NaN 1 12 True False NaN 2 21 False False NaN 3 15 False True 12.0 4 18 False False 12.0 5 19 False False 12.0 6 13 True False 12.0 7 9 False False 12.0 8 10 False True 9.0 9 50 False False 9.0
注:索引3的
result是索引1-3区间内A列的最小值,索引8的result是索引6-8区间内A列的最小值。
解决方案
通过分组标记、组内计算最小值再向前填充的方式实现:
# 用start列的累积和生成区间分组ID df['group'] = df['start'].cumsum() # 仅在end为True时,计算当前组的A列最小值 df['result'] = np.where(df['end'], df.groupby('group')['A'].transform('min'), np.nan) # 向前填充空值,让区间结束后的行继承最小值 df['result'] = df['result'].ffill() # 移除辅助分组列 df = df.drop('group', axis=1) print(df)
逻辑说明
- 分组标记:
start列的累积和会为每个由start=True开启的区间分配唯一ID,确保每个区间独立分组。 - 计算最小值:仅在
end=True的行,计算当前分组内A列的最小值并赋值给result。 - 向前填充:用
ffill()将result的空值填充为上一个有效最小值,实现区间结束后的值继承。
内容的提问来源于stack exchange,提问作者July
相关产品推荐
相关产品推荐

