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

在DataFrame中基于后续连续行条件查找目标列值

在DataFrame中基于后续连续行条件查找目标列值

嘿,我明白你要做的事儿了——就是找出那些Inst值,它们之后连续5次迭代的Error都能稳稳低于2.5对吧?之前的方法没跑通,大概率是没处理好“连续后续行”的窗口方向或者边界问题,我给你整几个实用的纯pandas方案,直接能用~

先明确需求细节

先确认下:你要找的是当某个Inst出现后,接下来的5行(也就是5次迭代)的Error全部小于2.5,对吧?如果是包含当前Inst所在行在内的连续5行,我也会把对应的调整方法写上。

方案一:循环遍历(小数据量友好,直观好懂)

如果你的DataFrame行数不多,用循环遍历的方法最直观,新手也容易调试:

import pandas as pd

# 先模拟你的DataFrame(你替换成自己的真实数据就行)
df = pd.DataFrame({
    'Inst': [204270, 204273, 204276, 204279, 204282, 204285, 204288, 204291, 204294, 204297, 204300, 204302, 204305, 204308, 204311],
    'Error': [3.0, 2.6, 2.4, 2.3, 2.2, 2.1, 2.0, 3.1, 2.7, 2.6, 2.5, 2.4, 2.3, 2.2, 2.1]
})

target_insts = []
for idx, row in df.iterrows():
    # 先判断当前行后面有没有足够的5行,避免索引越界
    if idx + 5 > len(df) - 1:
        continue
    # 取出当前行之后的5行的Error值
    next_5_errors = df.loc[idx+1:idx+5, 'Error']
    # 检查是否所有Error都小于2.5
    if all(next_5_errors < 2.5):
        target_insts.append(row['Inst'])

print("符合条件的Inst值:", target_insts)

如果你的需求是包含当前行在内的连续5行Error都小于2.5,只需要把代码里的idx+1:idx+5改成idx:idx+4,同时把判断条件改成idx +4 > len(df)-1就行。

方案二:向量化操作(大数据量高效)

如果你的DataFrame行数很多,循环会变慢,这时候用pandas的向量化操作更高效,不用逐行遍历:

import pandas as pd

# 还是先模拟你的数据
df = pd.DataFrame({
    'Inst': [204270, 204273, 204276, 204279, 204282, 204285, 204288, 204291, 204294, 204297, 204300, 204302, 204305, 204308, 204311],
    'Error': [3.0, 2.6, 2.4, 2.3, 2.2, 2.1, 2.0, 3.1, 2.7, 2.6, 2.5, 2.4, 2.3, 2.2, 2.1]
})

# 生成后续1到5行的Error列,用shift(-i)获取第i行之后的Error
for i in range(1, 6):
    df[f'error_next_{i}'] = df['Error'].shift(-i)

# 检查这5列是否全部<2.5,同时确保没有NaN(也就是有足够的后续行)
df['all_next_5_ok'] = (df[[f'error_next_{i}' for i in range(1,6)]] < 2.5).all(axis=1) & ~df[[f'error_next_{i}' for i in range(1,6)]].isna().any(axis=1)

# 提取符合条件的Inst值
target_insts = df.loc[df['all_next_5_ok'], 'Inst'].tolist()

# 可以删掉临时生成的列,保持DataFrame整洁
df.drop(columns=[f'error_next_{i}' for i in range(1,6)], inplace=True)

print("符合条件的Inst值:", target_insts)

为啥你之前的方法没成功?

大概率是踩了这两个坑:

  • 用了pandas默认的rolling窗口,但默认的rolling是向前取窗口(包含当前行和之前的行),而你需要的是向后取窗口(当前行之后的行),方向搞反了就出不来正确结果;
  • 没处理边界情况:最后4行(假设窗口是5)根本没有足够的后续行,直接判断会出现NaN或者索引越界,导致结果出错。

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.08 12:18:04