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

如何筛选DataFrame中符合条件的行及其上下各一行?

解决DataFrame筛选目标行及其上下行的问题

我明白你想要的效果:把col1小于100的行都找出来,同时还要带上这些行的前一行和后一行——哪怕这两行不满足条件对吧?你之前用idx=df.index[df['col1']<100]拿到目标行的索引是对的,但df.iloc[idx-1:idx+1]报错是因为iloc没法直接用一组索引值来批量生成切片范围,它只能处理单个的切片(比如iloc[5:8])或者单个索引的列表(比如iloc[[5,6,7]]),没法识别你传入的Int64Index作为切片的起止。

下面给你两种靠谱的解决方法,分别适用于不同的索引场景:

方法一:适用于连续整数索引的DataFrame

如果你的DataFrame索引是连续的整数(比如默认的0,1,2,...),可以直接通过索引值加减来收集所有需要的行:

import pandas as pd
import numpy as np

# 先拿到符合条件的索引
idx = df.index[df['col1'] < 100]

# 把目标行、前一行、后一行的索引都合并起来
all_indices = np.concatenate([idx - 1, idx, idx + 1])

# 过滤掉超出DataFrame索引范围的无效值(比如第一行的前一行、最后一行的后一行)
valid_indices = all_indices[(all_indices >= df.index[0]) & (all_indices <= df.index[-1])]

# 去重并排序,保证结果和原DataFrame的顺序一致
valid_indices = sorted(set(valid_indices))

# 最终结果
result_df = df.loc[valid_indices]

方法二:适用于任意类型索引(非连续整数、datetime等)

如果你的DataFrame索引不是连续整数(比如日期索引、自定义字符串索引),就不能直接用索引值加减了,得先拿到索引对应的位置,再通过位置来处理:

# 拿到符合条件的索引
idx = df.index[df['col1'] < 100]

target_positions = set()
for index_val in idx:
    # 获取当前索引在DataFrame中的位置
    pos = df.index.get_loc(index_val)
    
    # 添加前一行的位置(如果不是第一行)
    if pos > 0:
        target_positions.add(pos - 1)
    # 添加当前行的位置
    target_positions.add(pos)
    # 添加后一行的位置(如果不是最后一行)
    if pos < len(df) - 1:
        target_positions.add(pos + 1)

# 把位置排序,保证顺序正确
target_positions = sorted(target_positions)

# 通过iloc获取结果
result_df = df.iloc[target_positions]

这两种方法都能帮你拿到想要的结果,而且不会出现之前的类型错误~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 06:42:37