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

