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

