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

Pandas实现无循环判断当前行值小于前n行所有值及反向判断的方法

Pandas 无循环实现前后n行极值筛选问题

首先先把示例数据的创建代码放出来,方便大家复现:

import pandas as pd
dataframe = pd.DataFrame(
    {
        'col_name': [2, 3, 1, 0, 5, 4, 3, 3]
    }
)

一、筛选值小于前n行所有值的行

你的需求是找到每一行的值比它前面n行的所有值都小的行(比如n=2时,目标索引是2、3、6),而且不能用for循环。你提到的思路需要稍微修正下:应该是统计前n行中大于当前行的值的数量等于n,才说明当前行比前n行所有值都小。不过我推荐用更高效的方式——直接对比当前值和前n行的最小值,毕竟如果当前值比前n行的最小值还小,那自然比所有前n行的值都小。

方法1:滚动最小值法(推荐,性能更好)

用rolling窗口计算前n行的最小值,再通过shift(1)把结果对齐到当前行的位置,最后判断当前值是否小于这个最小值:

n = 2
# 计算前n行的最小值,shift(1)让每个位置对应它前面n行的最小值
prev_n_min = dataframe['col_name'].rolling(window=n).min().shift(1)
# 筛选条件:当前值 < 前n行最小值,前n个行没有足够的前n行,自动为NaN,筛选时会被排除
mask = dataframe['col_name'] < prev_n_min
# 获取符合条件的索引
result_indices = dataframe[mask].index.tolist()
print(result_indices)  # 输出 [2, 3, 6],和预期一致

方法2:基于你的思路(统计前n行大于当前值的数量)

如果一定要用统计数量的思路,可以用rolling的apply方法,对包含当前行和前n行的窗口,统计前n行中大于当前值的元素个数是否等于n:

n = 2
# 对每个窗口,统计前n行(窗口的前n个元素)大于当前行(窗口最后一个元素)的数量
mask = dataframe['col_name'].rolling(window=n+1).apply(
    lambda x: (x[:-1] > x[-1]).sum() == n, raw=True
)
# 前n个行没有足够的前n行,手动把这些位置的mask设为False
mask.iloc[:n] = False
result_indices = dataframe[mask].index.tolist()
print(result_indices)  # 输出 [2, 3, 6]

二、筛选值大于后n行所有值的行

这个逻辑和前面正好相反,我们需要判断当前行的值是否比它后面n行的所有值都大,也就是当前值大于后n行的最大值。

方法:反向滚动最大值法

可以直接用rolling的反向窗口,或者把数据反转后处理再反转回来,后者更直观:

n = 2
# 反转列数据,此时原数据的后n行变成了反转数据的前n行
reversed_col = dataframe['col_name'][::-1]
# 计算反转数据中前n行的最大值,shift(1)对齐到当前行
prev_n_max_reversed = reversed_col.rolling(window=n).max().shift(1)
# 再反转回来,得到原数据中每个行对应的后n行最大值
next_n_max = prev_n_max_reversed[::-1]
# 筛选条件:当前值 > 后n行最大值,最后n个行没有足够的后n行,设为False
mask = dataframe['col_name'] > next_n_max
mask.iloc[-n:] = False
# 获取符合条件的索引
result_indices = dataframe[mask].index.tolist()
print(result_indices)  # 输出 [1, 4, 5]

如果你想用更直接的反向窗口写法,也可以这样:

n = 2
# 用closed='right'指定窗口包含右侧的行,shift(-n)对齐到当前行
next_n_max = dataframe['col_name'].rolling(window=n, closed='right').max().shift(-n)
mask = dataframe['col_name'] > next_n_max
mask.iloc[-n:] = False
result_indices = dataframe[mask].index.tolist()
print(result_indices)  # 同样输出 [1, 4, 5]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 21:37:38