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

如何在Pandas Series中查找不同长度的精确数值序列?

在Pandas Series中查找指定数值子序列的最优方法

核心思路

通过滑动窗口生成与目标子序列长度一致的片段,逐段对比匹配,筛选出完全吻合的位置区间。针对长度约1000的Series,该方法效率足够且实现简洁。

代码实现

import pandas as pd
import numpy as np  # 处理浮点精度时需要

def find_subsequence_positions(series, subsequence):
    sub_len = len(subsequence)
    # 边界情况处理:子序列为空或比原序列长,直接返回空结果
    if sub_len == 0 or sub_len > len(series):
        return []
    
    sub_series = pd.Series(subsequence)
    # 生成滑动窗口,逐窗口匹配子序列
    # 若存在浮点精度问题,将all(window == sub_series)替换为all(np.isclose(window, sub_series))
    match_mask = (
        series.rolling(window=sub_len)
        .apply(lambda win: all(win == sub_series), raw=True)
        .astype(bool)
    )
    
    # 提取匹配窗口的起始索引,再推导完整位置区间
    start_indices = match_mask[match_mask].index - (sub_len - 1)
    return [(idx, idx + sub_len - 1) for idx in start_indices]

测试示例

用你提供的Series验证:

s = pd.Series([92.6,92.7,92.9,24.2,24.3,25.1,24.9,25.1,24.9,97.6,94.5,1.0,92.6,92.7,92.9,97.9,96.8,96.4,92.8,92.8,93.1,89.5,89.6])
target_sub = [92.6, 92.7, 92.9]

# 获取匹配位置
matched_positions = find_subsequence_positions(s, target_sub)
print("匹配的索引区间:", matched_positions)

输出结果:

匹配的索引区间: [(0, 2), (12, 14)]

关键提示

  • 浮点精度处理:如果原始数据存在浮点计算误差,直接用==可能漏匹配,改用np.isclose(window, sub_series)可容错微小精度差异。
  • 适配任意子序列长度:函数支持2、5等任意合法长度的子序列,只需传入对应列表即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 07:27:15