如何在Pandas DataFrame中按连续重复组生成计数新列?
实现连续重复值的序号标记(Pandas)
原始数据
import pandas as pd df = pd.DataFrame({'data': [0,0,0,1,1,1,2,2,2,3,3,4,4,5,5,0,0,0,0,2,2,2,2,4,4,4,4]})
数据预览:
data 0 0 1 0 2 0 3 1 4 1 5 1 6 2 7 2 8 2 9 3 10 3 11 4 12 4 13 5 14 5 15 0 16 0 17 0 18 0 19 2 20 2 21 2 22 2 23 4 24 4 25 4 26 4
需求说明
新增一列new,标记同一连续重复的data值的出现次数,最终输出如下:
data new 0 0 1 1 0 2 2 0 3 3 1 1 4 1 2 5 1 3 6 2 1 7 2 2 8 2 3 9 3 1 10 3 2 11 4 1 12 4 2 13 5 1 14 5 2 15 0 1 16 0 2 17 0 3 18 0 4 19 2 1 20 2 2 21 2 3 22 2 4 23 4 1 24 4 2 25 4 3 26 4 4
简便实现方法
不需要转成Python列表循环,直接用Pandas内置方法就能高效实现:
方法1:分步实现(清晰易懂)
- 先标记连续重复的分组:当当前行
data与上一行不同时,分组ID递增 - 对每个分组内的行进行计数,加1得到从1开始的序号
# 生成分组标识 df['group'] = (df['data'] != df['data'].shift()).cumsum() # 分组内计数并加1 df['new'] = df.groupby('group').cumcount() + 1 # 可选:删除临时分组列 df = df.drop('group', axis=1)
方法2:一行代码简化
把分组和计数逻辑合并,无需临时列:
df['new'] = df.groupby((df['data'] != df['data'].shift()).cumsum()).cumcount() + 1
这种方法利用Pandas的向量化操作,比循环列表的方式效率更高,尤其适合处理大规模数据集。
内容的提问来源于stack exchange,提问作者moongdal
相关产品推荐
相关产品推荐

