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

如何用Pandas滚动窗口查找DataFrame中稳定值的连续窗口

基于Pandas查找连续稳定值的行并提取数组

原始数据集

先还原你提供的DataFrame:

import pandas as pd
import numpy as np

df = pd.DataFrame({
    'col_1': [1,2,3,4,5,6,7,8],
    'col_2': [5.6,4.3,6.2,5.2,4.7,5.1,4.4,6.1],
    'col_3': [2.1,2.3,2.25,2.15,2.11,2.10,2.24,2.12]
})

实现步骤

1. 用rolling窗口判断连续行的数值稳定性

指定窗口大小(比如你需要的3行),对每个窗口内的col_3计算最大值与最小值的差值,判断是否≤0.05:

window_size = 3
# 给每个窗口标记是否符合稳定条件
df['stable_flag'] = df['col_3'].rolling(window=window_size).apply(lambda x: x.max() - x.min()) <= 0.05

2. 定位并提取符合条件的连续行

stable_flag为True的位置,代表该位置是一个合格连续窗口的最后一行。通过这个位置反推整个窗口的行范围:

# 找到所有合格窗口的结束索引
valid_end_idx = df[df['stable_flag']].index
# 提取每个窗口的完整行
valid_rows = pd.DataFrame()
for idx in valid_end_idx:
    start_idx = idx - window_size + 1
    valid_rows = pd.concat([valid_rows, df.loc[start_idx:idx]])

# 去重(避免重叠窗口重复提取同一行)
valid_rows = valid_rows.drop_duplicates().drop(columns='stable_flag')

3. 将col_3转为numpy数组

从筛选结果中提取目标列并转换格式:

col3_array = valid_rows['col_3'].to_numpy()

结果展示

运行后得到的筛选行与你的期望完全一致:

col_1  col_2  col_3
3      4    5.2   2.15
4      5    4.7   2.11
5      6    5.1   2.10

提取的col_3数组为:array([2.15, 2.11, 2.10])

扩展说明

  • 调整窗口大小只需修改window_size参数即可适配任意X行需求
  • 若要实现你之前尝试的“值在2.10-2.25之间的连续行”,可在筛选时增加范围条件:df[(df['col_3'] >=2.10) & (df['col_3'] <=2.25)],再结合索引连续性判断(比如df['is_consecutive'] = df.index.diff() ==1)锁定连续行块

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 01:27:26