Python pandas中如何实现序列中断时自动重置的cumcount累计计数?
pandas连续相同值分组累计计数实现方法
你原来使用的df.groupby(["col_1"]).cumcount()是将所有col_1取值相同的行归为同一组做累计计数,不会区分值是否连续出现,因此最后一行a的计数为2,不符合需求。
实现代码
import pandas as pd # 构造示例数据 data = { 'col_1': ['a', 'a', 'b', 'b', 'a'], 'col_2': [3, 2, 1, 0, -3]} df = pd.DataFrame.from_dict(data) # 生成连续相同值的分组标识:值变化时分组id+1 df['group_id'] = (df['col_1'] != df['col_1'].shift()).cumsum() # 按连续分组+列值分组后累计计数 df['seq'] = df.groupby(['group_id', 'col_1']).cumcount() # 可删除临时生成的group_id列 df.drop('group_id', axis=1, inplace=True)
输出结果
执行后df的输出如下,符合预期:
col_1 col_2 seq 0 a 3 0 1 a 2 1 2 b 1 0 3 b 0 1 4 a -3 0
实现原理
- 用
df['col_1'].shift()获取上一行的col_1值,和当前行比较得到布尔序列,值变化时返回True - 对布尔序列做
cumsum()累加(True按1计算),得到连续相同值的唯一分组id - 联合分组id和
col_1做groupby,此时每个分组内都是连续出现的相同值,调用cumcount()即可实现打断后重置计数的效果
内容的提问来源于stack exchange,提问作者vojtam
相关产品推荐
相关产品推荐

