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

如何在Pandas中筛选col4值大于前后行的行并存入空DataFrame?

Pandas筛选局部最大值行的优化方案

原始数据与需求

给定如下DataFrame:

import pandas as pd

df = pd.DataFrame(
    {
        "col1": [0,1,2,3,4,5,6,7,8,9,10],
        "col2": ["A","B","C","D","E","F","G","H","I","J","K"],
        "col3": [1e-0,1e-1,1e-2,1e-3,1e-4,1e-5,1e-6,1e-7,1e-8,1e-9,1e-10],
        "col4": [0,4,2,5,6,7,6,3,6,2,1]
    }
)

需求:筛选出col4值同时大于前一行和后一行对应值的行,存入新的DataFrame。

原始实现代码

原代码通过循环遍历行进行判断,虽能得到预期结果,但可读性差且效率较低:

df1=pd.DataFrame()
for i in range(1,len(df)-1,1):
    if ( (df.iloc[i]['col4'] > df.iloc[i+1]['col4']) and (df.iloc[i]['col4'] > df.iloc[i-1]['col4']) ):
        df1=pd.concat([df1,df.iloc[i:i+1]])

预期结果:

col1 col2        col3  col4
1      1    B  1.000000e-01     4
5      5    F  1.000000e-05     7
8      8    I  1.000000e-08     6

优化实现方案

利用Pandas的矢量化操作替代循环,通过shift()函数快速获取前后行的值,构建布尔掩码直接筛选,代码更简洁高效:

# 生成布尔掩码:当前行col4大于前一行且大于后一行
mask = (df['col4'] > df['col4'].shift(1)) & (df['col4'] > df['col4'].shift(-1))
# 筛选符合条件的行并赋值给df1
df1 = df[mask].copy()

代码说明

  • df['col4'].shift(1):将col4列向下偏移1行,得到每行的前一行值;
  • df['col4'].shift(-1):将col4列向上偏移1行,得到每行的后一行值;
  • 布尔掩码mask会自动忽略首尾行(因为首尾行没有前/后行,对应位置为NaN,与数值比较结果为False),无需额外处理边界;
  • 直接通过df[mask]筛选行,避免了循环中反复concat带来的性能损耗,尤其是数据量较大时优势明显。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 11:45:38