商城首页欢迎来到中国正版软件门户

您的位置: 首页 > 文章列表 > 编程开发 > 如何统计列中连续重复值的频次

如何统计列中连续重复值的频次

  发布于2026-07-11 阅读(0)

扫一扫,手机访问

本文介绍使用 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提供了一套非常简洁的向量化方案,核心思路只有四步:

  1. Series.shift() 把原列下移一行,让每一行跟它前面那行对齐;
  2. Series.ne() 比较当前值和前一个值是否相等——注意 ne() 就是 !=,返回布尔值;
  3. 对这个布尔序列做 cumsum(),每次遇到值变化,累计和就加1,这样每个连续段就被分配了一个唯一的ID;
  4. 基于这个组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高级分组操作里的经典范例。

本文转载于:https://www.php.cn/faq/2798936.html 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。

热门关注