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

Python实现重复行计数:其他行重复≥3次时重置计数器

按规则重置分组累计计数器

问题描述

现有如下DataFrame:

import pandas as pd
df = pd.DataFrame({"word": ["A","A","A","A","A","A","A","A","A","B","A","B","B","A","A","A","B","B","B","A","B","B"]})

需要实现的规则:

  • 对每个word(A和B)维护一个累计计数器
  • 每当另一个word连续出现3次及以上时,当前word的计数器重置为1重新累计
  • 若另一个word仅连续出现1-2次,当前word的计数器继续累计,不重置

你尝试的普通分组累计代码(如下)无法满足上述规则,因为它只会单纯按word分组累计,不会根据另一个word的连续出现次数重置计数器:

df['num_aux']=1
df['cumulative_numero']=df.groupby(['word'])['num_aux'].cumsum()

解决方案

通过识别连续相同word的分组、判断重置触发条件,再结合复合分组实现需求:

import pandas as pd
import numpy as np

# 初始化DataFrame
df = pd.DataFrame({"word": ["A","A","A","A","A","A","A","A","A","B","A","B","B","A","A","A","B","B","B","A","B","B"]})

# 1. 标记连续相同word的分组
df['group'] = (df['word'] != df['word'].shift()).cumsum()

# 2. 计算每个连续分组的长度
group_lengths = df.groupby('group')['word'].count()
df['group_len'] = df['group'].map(group_lengths)

# 3. 标记重置触发点:当前行属于新word组,且前一个组(另一个word)的长度>=3
df['reset_trigger'] = (df['word'] != df['word'].shift()) & (df['group_len'].shift() >= 3)

# 4. 按word + 重置触发累计值分组,实现计数器的重置累计
df['num_aux'] = 1
df['cumulative_numero'] = df.groupby(['word', df['reset_trigger'].cumsum()])['num_aux'].cumsum()

# 可选:删除中间辅助列
df = df.drop(['group', 'group_len', 'reset_trigger', 'num_aux'], axis=1)

print(df)

结果说明

最终输出的cumulative_numero列符合规则:

  • A的计数器:前9个A累计1-9;第10个A(索引10)继续累计到10;接下来3个A(索引13-15)累计到11-13;最后1个A(索引19)因为之前B连续出现3次,重置为1
  • B的计数器:第1个B(索引9)因为之前A连续出现9次,重置为1;接下来2个B(索引11-12)累计到2-3;之后3个B(索引16-18)因为之前A连续出现3次,重置为1-3;最后2个B(索引20-21)继续累计到4-5

内容的提问来源于stack exchange,提问作者mali

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 17:12:54