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

