如何在Pandas Series中统计连续重复值的出现次数?
解决Pandas Series连续重复值计数问题
这个需求其实很常见,我来给你拆解一下思路,一步步实现你要的效果:
步骤1:构造示例数据
先把你给出的示例Series创建出来,方便后续测试:
import pandas as pd s = pd.Series([True, False, False, False, True, True, False])
步骤2:识别值的变化点
我们需要标记出当前值和前一个值不同的位置(包括第一个元素,因为它没有前值,默认作为新组的起点):
# 比较当前值与前一个值是否不同,shift()会把第一个元素变成NaN,所以用fillna(True)把第一个位置标记为变化点 change_points = s != s.shift().fillna(True)
这一步得到的change_points结果是:
0 True 1 True 2 False 3 False 4 True 5 False 6 True dtype: bool
步骤3:生成分组ID
对变化点做累加求和,这样每一段连续相同的值会被分配到同一个分组ID里:
group_ids = change_points.cumsum()
group_ids的结果是:
0 1 1 2 2 2 3 2 4 3 5 3 6 4 dtype: int64
步骤4:逐组计数
最后对每个分组ID使用cumcount()(从0开始计数),再加1就得到从1开始的连续重复次数:
counts = s.groupby(group_ids).cumcount() + 1
最终的counts就是你要的结果:
0 1 1 1 2 2 3 3 4 1 5 2 6 1 dtype: int64
简洁版一行代码
如果想更简洁,可以把步骤合并成一行:
counts = s.groupby((s != s.shift().fillna(True)).cumsum()).cumcount() + 1
这样就完美实现了你需要的效果,每一次值变化时计数都会重置为1,连续相同的值则递增计数。
内容的提问来源于stack exchange,提问作者Ale
相关产品推荐
相关产品推荐

