You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何加速识别DataFrame中连续5个同符号值的行?

高效实现连续5行符号相同的标记方案

针对你用rolling+apply处理大数据集速度慢的问题,完全可以用矢量化分组+累计计数的方式替代,性能提升非常明显,具体步骤如下:

1. 快速生成符号标识

先把val列转换成对应的符号标记:正数记1,负数记-1,0记0(0会中断连续序列),用numpy.sign()实现,这是完全矢量化的操作,速度极快:

import pandas as pd
import numpy as np

df['sign'] = np.sign(df['val'])

2. 划分连续符号的分组

当符号发生变化(包括遇到0)时,就开启一个新的分组。通过计算符号变化的累计和来生成分组ID,这样相同连续符号的行会被分到同一组:

# 对比当前行与上一行的符号,不同则标记为1,相同为0,再累计求和得到分组ID
df['group'] = (df['sign'] != df['sign'].shift(1)).cumsum()

3. 计算每组内的连续次数

对每个分组,用cumcount()计算当前行在组内的位置,加1后得到连续相同符号的次数:

df['consec_count'] = df.groupby('group').cumcount() + 1

4. 生成最终标记列

当连续次数≥5,且当前符号不是0时,标记为1,否则为0:

df['consecutive'] = np.where((df['consec_count'] >= 5) & (df['sign'] != 0), 1, 0)

为什么这个方法更快?

rolling+apply本质是逐行调用自定义函数,属于循环操作,而上面的方法全用pandas/numpy的内置矢量化函数,这些函数底层是C实现的,没有Python循环的开销,在百万行级的数据集上,速度能提升几十倍甚至上百倍。

边界情况说明

  • 从第5个连续相同符号的行开始,后续该行及之后的同符号连续行都会标记为1;
  • 只要遇到0,连续序列就会重置,后续的正负号会重新开始计数;
  • 若连续符号不足5个,标记始终为0。

内容的提问来源于stack exchange,提问作者OldChi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 23:20:37