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
相关产品推荐
相关产品推荐

