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

