如何统计列中连续重复值的频次
作者:WarmHope
时间:2026-07-11
浏览:0
使用shift()与ne()构建连续组标识,结合cumsum()生成唯一组ID,再通过groupby().transform('size')对每行标注当前连续段长度,从而按连续块而非全局分组统计重复值频次,该方法适用于日志分析、传感器时序等场景。
本文介绍使用 pandas 按“连续块”(而非全局分组)统计某列中重复值出现次数的方法,核心是通过 shift() + ne() 构建连续组标识,再结合 groupby().transform('size') 实现每行标注当前连续段长度。
这篇文章要讲的,是pandas里一个很实用但容易踩坑的技巧——按“连续块”来统计重复值出现的次数,而不是按全局分组。什么意思呢?比方说,你有一列数据是 [0, 0, 0, 1, 1, 0],如果直接用 value_counts() 或者 groupby().size(),结果会告诉你0出现了4次,1出现了2次。但这里显然有两个不同的0段:前面三个0连在一起,末尾单独一个0。它们本质上是两个独立的“运行段”(run-length encoding),需要分别统计长度。
那么,怎么才能识别出这些连续变化的边界呢?pandas提供了一套非常简洁的向量化方案,核心思路只有四步:
- 用
Series.shift()把原列下移一行,让每一行跟它前面那行对齐; - 用
Series.ne()比较当前值和前一个值是否相等——注意ne()就是!=,返回布尔值; - 对这个布尔序列做
cumsum(),每次遇到值变化,累计和就加1,这样每个连续段就被分配了一个唯一的ID; - 基于这个组ID做
groupby,然后用transform('size')把每组长度广播回原始数据框的每一行。
直接看代码更清楚:
import pandas as pd
# 构造示例数据
df = pd.DataFrame({'Value': [0, 0, 0, 1, 1, 0]})
# 生成连续分组标识,并计算每组大小
df['Freq'] = df.groupby(
df['Value'].ne(df['Value'].shift()).cumsum()
)['Value'].transform('size')
print(df)
运行结果:
Value Freq 0 0 3 1 0 3 2 0 3 3 1 2 4 1 2 5 0 1
注意几个细节:
df['Value'].ne(df['Value'].shift())在首行会因为shift()产生NaN,而NaN != x恒为True,所以第一行天然被当作新组的起点,完全符合预期。- 这个方法是完全向量化的,性能非常优秀,处理百万级数据也不在话下。
- 如果你不仅需要每行的段长度,还想知道每个段的起始位置、具体值等完整信息,可以改用
pd.Series.diff().ne(0).cumsum()配合agg()提取聚合结果。 - 千万注意:不要误用
df.groupby('Value').transform('size'),那统计的是全局重复频次——比如所有0会统计算出4次,完全无法区分连续段。
这个技巧在现实中非常常用:日志分析里统计连续失败次数,传感器时序数据中计算状态持续时长,金融行情里统计连续涨跌天数……凡是需要按“连续块”而不是“全局值”来计数的场景,都可以拿这套方法直接套用,属于pandas高级分组操作里的经典范例。
作者最新文章
Photoshop图层阵列怎么做?复制多个图层并整齐排列
2026-09-22 16:42
3dmax动画技巧总结:动画制作步骤与渲染视频教程
2026-09-22 14:47
思源笔记
2026-09-16 17:42
在线PDF转TXT操作步骤与乱码排查指南
2026-09-04 13:02
PDF加水印后如何检查显示效果?在线工具操作步骤与避坑指南
2026-09-03 13:02
热门文章
更多
精品专题
更多
Mac软件
更多
WINDOWS
更多


































