如何计算当前值前连续小于它的行数?含分组场景实现
Pandas实现“当前值之前连续小于它的行数”计算
一、普通无分组场景
输入示例
import pandas as pd df = pd.DataFrame([10,9,8,11,10,11,13], columns=['value'])
预期输出
value number of last consecutive rows less than current 0 10 0 1 9 0 2 8 0 3 11 3 4 10 0 5 11 1 6 13 6
无循环实现方案
通过条件标记+累计求和重置实现,无需循环:
# 标记当前值是否大于前一个值 df['gt_prev'] = df['value'] > df['value'].shift(1) # 生成分组键:每次不满足大于前一个时,分组键累加 df['group_key'] = (~df['gt_prev']).cumsum() # 分组内计数,得到连续小于当前值的行数 df['number of last consecutive rows less than current'] = df.groupby('group_key').cumcount() # 清理临时列 df = df.drop(['gt_prev', 'group_key'], axis=1)
逻辑说明:
- 当当前值不大于前一个时,
gt_prev为False,取反后触发group_key累加,形成新分组 - 每个分组内的
cumcount()从0开始计数,正好对应当前行之前连续小于它的行数
二、分组场景
输入示例
df = pd.DataFrame( [[10,0],[9,0],[7,0],[8,0],[11,1],[10,1],[11,1],[13,1]], columns=['value','group'] )
问题说明
直接使用df.groupby('group')['value'].expanding()无法实现需求,因为expanding窗口是累计所有历史行,无法区分“连续”条件,会导致逻辑错误或报错。
分组场景无循环实现方案
通过groupby结合自定义函数,复用普通场景逻辑:
def count_consecutive_less(series): gt_prev = series > series.shift(1) group_key = (~gt_prev).cumsum() return group_key.groupby(group_key).cumcount() df['number of last consecutive rows less than current'] = df.groupby('group')['value'].apply(count_consecutive_less)
运行结果:
value group number of last consecutive rows less than current 0 10 0 0 1 9 0 0 2 7 0 0 3 8 0 1 4 11 1 0 5 10 1 0 6 11 1 1 7 13 1 2
内容的提问来源于stack exchange,提问作者tompal18
相关产品推荐
相关产品推荐

