如何在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
相关产品推荐
相关产品推荐

