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

如何在Pandas DataFrame中查找某列的最后一个最高值

在Pandas DataFrame中从后往前查找首个符合条件的峰值元素

给定如下DataFrame:

df = pd.DataFrame({'col1': [102, 97, 94, 90, 90, 103, 90, 101, 62, 90, 90, 90]})

需求是从最后一行开始向上遍历,找到第一个符合要求的“最高值”——此例中返回101,因为它的前一个值是90,是从末尾往上第一个出现的、比前一个元素大的较高值。

之前尝试的代码仅返回列的最后一个元素,无法满足需求:

import pandas as pd

df = pd.DataFrame({'col1': [102, 97, 94, 90, 90, 90, 90, 101, 62, 90, 90, 90]})

def g(df):
    #return df.nlargest(1, 'col1')
    return df.iloc[::-1].col1.head(1).iloc[0]

result = g(df.copy())
print(result)

解决方案

核心思路是先标记出所有“当前值大于前一个值”的位置,再从后往前找到第一个符合该条件的位置,提取对应值:

import pandas as pd

df = pd.DataFrame({'col1': [102, 97, 94, 90, 90, 103, 90, 101, 62, 90, 90, 90]})

def find_last_target_value(df, col_name):
    # 生成布尔序列,标记当前元素大于前一个元素的位置
    is_greater_than_prev = df[col_name] > df[col_name].shift(1)
    # 反转序列后取第一个True的索引(即从原末尾往前找第一个符合条件的位置)
    target_idx = is_greater_than_prev[::-1].idxmax()
    # 返回对应的值
    return df.loc[target_idx, col_name]

result = find_last_target_value(df, 'col1')
print(result)  # 输出:101

代码说明

  • df[col_name].shift(1):将列数据向下偏移一行,实现当前元素与前一个元素的对比
  • is_greater_than_prev[::-1].idxmax():反转布尔序列后,idxmax()会返回第一个True的索引,对应原DataFrame中从后往前数第一个符合条件的位置
  • 若需要调整判断条件(比如要求当前值是局部最大值,即同时大于前后元素),只需修改布尔序列的生成逻辑即可,例如:
    is_local_peak = (df[col_name] > df[col_name].shift(1)) & (df[col_name] > df[col_name].shift(-1))
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 13:58:13