Pandas DataFrame连续相同值分组累计计数及滚动周期无变化次数统计
问题分析
你当前的实现逻辑存在偏差,df['col'] == df['col'].shift(1) 只能得到当前行与上一行是否相等的布尔序列,rolling求和是统计窗口内相邻相等的次数总和,无法实现「遇到不同值就重置计数」的连续统计需求。
实现方案
无滚动周期限制的基础实现
直接实现你给出的示例输出效果,核心逻辑是识别值变化的节点,按连续相同值分组后计数:
import pandas as pd df = pd.DataFrame({'col':list('aaaabbab')}) # 识别值变化的标记点,值和上一行不同时标记为True change_flag = df['col'].ne(df['col'].shift()) # 按变化标记累加得到连续相同值的分组ID group_id = change_flag.cumsum() # 每个分组内按顺序计数,得到连续相同次数 df['result'] = df.groupby(group_id).cumcount()
运行后df['result']的输出就是你期望的结果:
0 0 1 1 2 2 3 3 4 0 5 1 6 0 7 0 Name: result, dtype: int64
带滚动周期限制的扩展实现
如果后续需要限制统计的滚动窗口大小,比如窗口为N,只统计N个周期内的连续相同次数,只需要在基础结果上限制最大值即可:
window_size = 3 # 滚动窗口内最多连续相同次数为窗口大小-1,超过的部分截断 df['rolling_result'] = df['result'].clip(upper=window_size - 1)
如果需要更复杂的滚动窗口内连续统计逻辑,也可以基于上述分组计数的结果二次处理,该需求完全可以配合shift方法实现,不存在技术障碍。
内容的提问来源于stack exchange,提问作者Shane Kennedy
相关产品推荐
相关产品推荐

