【问题标题】:Python Pandas: Best way to find local maximums in large DFPython Pandas:在大型 DF 中找到局部最大值的最佳方法
【发布时间】:2021-10-28 14:02:00
【问题描述】:

我有一个包含许多周期的大型数据帧,每个周期内部有 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),但问题是,由于其中一个峰值通常更高,它会拉出数据中的第二大数字,而这不一定是另一个峰值。

此图显示了我希望能够找到的每个周期的峰值压力。

感谢您的帮助。

【问题讨论】:

    标签: python pandas dataframe max


    【解决方案1】:

    来自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 一直爱上我......
    • @QuangHoang find_peaks(df['Pressure'].values)[0],返回两个峰值和属性,我们似乎只需要峰值~ :-)
    • @QuangHoang 赞df.groupby('Cycle')['Pressure'].apply(lambda x : x.iloc[find_peaks(x.values)[0]])
    • 我知道,TIL argrextrema 也是如此。我指的是直接使用scipy.signal.argreextrema 对我不起作用。我需要像你一样from scipy.signal import ...
    • @QuangHoang 啊,scipy 和 numpy 工具箱有相同的“问题”
    【解决方案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
    

    【讨论】:

    • 感谢您的帮助,当我将其应用于我的数据时,我得到了这个::51: UserWarning: Boolean Series key will be reindexed to match DataFrame index. df3[local_maxes]
    猜你喜欢
    • 2023-01-05
    • 2012-12-28
    • 2016-03-16
    • 2021-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-10
    • 2018-06-09
    相关资源
    最近更新 更多