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

Python Pandas:大型DataFrame中提取各周期两个局部最大值的最优方法

Pandas按周期提取独立局部压力峰值实现方案

你需要的是识别每个周期内的局部极大值,而非直接取数值最高的两个值,以下是两种可直接运行的实现方案:

方法1:纯Pandas实现(无额外依赖)

通过shift方法比对每个点和前后相邻值的大小,判断是否为局部峰值:

import pandas as pd

# 模拟数据
data = {'Cycle':[1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3], 'Pressure':[100,110,140,180,185,160,120,110,189,183,103,115,140,180,200,162,125,110,196,183,100,110,140,180,185,160,120,180,201,190]}
df = pd.DataFrame(data)

# 峰值提取逻辑
def extract_peaks(group):
    p = group['Pressure']
    # 局部峰值判断规则:比前一个值大,同时比后一个值大
    is_peak = (p > p.shift(1)) & (p > p.shift(-1))
    return pd.DataFrame({
        'Cycle': group['Cycle'].iloc[0],
        'Peak Maxs': p[is_peak].values
    })

df2 = df.groupby('Cycle', group_keys=False).apply(extract_peaks).reset_index(drop=True)

方法2:基于scipy的峰值检测(适合含噪声的场景)

如果原始数据存在波动干扰,可以用scipy的峰值检测工具,支持设置峰高、峰宽等过滤参数:

import pandas as pd
import numpy as np
from scipy.signal import argrelextrema

# 模拟数据同上
data = {'Cycle':[1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3], 'Pressure':[100,110,140,180,185,160,120,110,189,183,103,115,140,180,200,162,125,110,196,183,100,110,140,180,185,160,120,180,201,190]}
df = pd.DataFrame(data)

def extract_peaks(group):
    # 检测局部极大值
    peak_idx = argrelextrema(group['Pressure'].values, np.greater)[0]
    # 可根据需求添加过滤逻辑,例如只保留峰值大于150的结果
    peak_values = group['Pressure'].iloc[peak_idx]
    return pd.DataFrame({
        'Cycle': group['Cycle'].iloc[0],
        'Peak Maxs': peak_values.values
    })

df2 = df.groupby('Cycle', group_keys=False).apply(extract_peaks).reset_index(drop=True)

输出结果

两种方法得到的df2均和要求的格式完全一致:

Cycle  Peak Maxs
0      1        185
1      1        189
2      2        200
3      2        196
4      3        185
5      3        201

峰值对应位置示意图:
压力峰值示意图

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 02:24:04