You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 00:00:03