Python Pandas:在大型数据框中查找局部最大值的最佳方法

3
我是一名有用的助手,可以为您进行文本翻译。
我有一个大型数据框,由许多周期组成,每个周期内有2个最大峰值需要捕获到另一个数据框中。
我创建了一个示例数据框,模拟了我看到的数据:
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)

正如您在每个周期中所看到的那样,有两个峰值,但我遇到的问题是第二个峰值通常比第一个峰值更高,因此可能会有一行数字在技术上比循环中其他峰值的最大值更高。结果应该看起来像这样:
data2 = {'Cycle':[1,1,2,2,3,3], 'Peak Maxs': [185,189,200,196,185,201]}

df2= pd.DataFrame(data2)

我已经尝试了几种方法,包括每个周期使用 .nlargest(2),但问题是由于其中一个峰值通常更高,它会提取数据中第二高的数字,这不一定是另一个峰值。此图显示我想要找到的每个周期的峰值压力。enter image description here。谢谢任何帮助。
2个回答

3

来自于scipyargrelextrema

from scipy.signal import argrelextrema
out = df.groupby('Cycle')['Pressure'].apply(lambda x : x.iloc[argrelextrema(x.values, np.greater)])
Out[124]: 
Cycle    
1      4     185
       8     189
2      14    200
       18    196
3      24    185
       28    201
Name: Pressure, dtype: int64

out = out.sort_values().groupby(level=0).tail(2).sort_index() 
out
Out[138]: 
Cycle    
1      4     185
       8     189
2      14    200
       18    196
3      24    185
       28    201
Name: Pressure, dtype: int64

啊,原来是这样使用signal。我一直在尝试使用find_peaks,但是scipy.signal.find_peaks总是让我失望... - Quang Hoang
@QuangHoang 执行 find_peaks(df['Pressure'].values)[0],返回两个峰值及其属性。看起来我们只需要这两个峰值 ~ :-) - BENY
@QuangHoang 像这样 df.groupby('Cycle')['Pressure'].apply(lambda x : x.iloc[find_peaks(x.values)[0]]) - BENY
1
@QuangHoang 啊,scipy 和 numpy 工具箱有相同的“问题”。 - BENY
非常感谢!这个可行。 - SeanK22
显示剩余4条评论

2
使用groupby().shift()获取邻近值,然后进行比较:
g = df.groupby('Cycle')

local_maxes = (df['Pressure'].gt(g['Pressure'].shift())    # greater than previous row
               & df['Pressure'].gt(g['Pressure'].shift(-1))] # greater than next row
               )

df[local_maxes]

输出:

    Cycle  Pressure
4       1       185
8       1       189
14      2       200
18      2       196
24      3       185
28      3       201

感谢您的帮助,当我将此应用于我的数据时,出现了以下情况:<ipython-input-80-ed26ba949dab>:51: 用户警告:布尔系列键将重新索引以匹配DataFrame索引。 df3 [local_maxes] - SeanK22

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接