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

如何高效检测pandas DataFrame中连续12行相同的d_max值?

优化方案:批量标记连续12个相同值的位置

你的需求是标记出df['d_max']中当前行与后续11行共12个值完全相同的位置,原代码手动写11个shift虽然能运行,但冗余且不易维护。下面提供几种更简洁、高效的实现方式:

方法1:批量生成shift对比(简洁易读)

直接通过循环批量生成后续11行与当前行的对比结果,再按行判断是否全部相等。这种写法扩展性极强,改窗口大小只需修改window_size参数:

window_size = 12
# 生成后续1到11行与当前行的布尔对比矩阵
compare_matrix = pd.concat(
    [df['d_max'].shift(-i) == df['d_max'] for i in range(1, window_size)],
    axis=1
)
# 按行判断所有对比是否都成立
df['is_peak'] = compare_matrix.all(axis=1)

方法2:利用diff与滚动求和(高性能向量化)

对于大数据量的场景,向量化操作比循环/apply效率高得多。核心思路是:如果连续12个值相同,那么它们之间的差值绝对值之和为0:

window_size = 12
# 计算相邻值的差的绝对值
abs_diff = df['d_max'].diff().abs()
# 滚动计算后续11个差值的和,若和为0则说明12个值全相同
df['is_peak'] = (abs_diff.rolling(window_size-1, min_periods=window_size-1)
                 .sum().shift(-(window_size-1)) == 0)

方法3:滚动窗口的最大值/最小值对比

另一种向量化思路:如果窗口内所有值相同,那么窗口的最大值和最小值必然相等。需要注意窗口方向,通过shift将窗口结果对应到起始行:

window_size = 12
# 计算向后12个值的最大值与最小值
window_max = df['d_max'].rolling(window_size, min_periods=window_size).max().shift(-window_size+1)
window_min = df['d_max'].rolling(window_size, min_periods=window_size).min().shift(-window_size+1)
# 最大值等于最小值则说明所有值相同
df['is_peak'] = window_max == window_min
# 可按需删除中间列
df.drop(['window_max', 'window_min'], axis=1, inplace=True)

说明

  • 三种方法的结果与原代码完全一致:最后11行因无法取到后续11个值,is_peak会自动为False
  • 方法2的性能最优,适合处理百万级以上的数据量;方法1最易读,适合小数据集或需要快速调试的场景

内容的提问来源于stack exchange,提问作者S N B

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 06:35:29