熊猫找到局部最大值和最小值,而不是高原值

Posted

技术标签:

【中文标题】熊猫找到局部最大值和最小值,而不是高原值【英文标题】:Pandas finding local max and min, not plateau values 【发布时间】:2021-03-28 06:37:07 【问题描述】:

我需要在 pandas DataFrame 中找到局部最大值和最小值,起初看起来这与Pandas finding local max and min 相同,但建议的解决方案似乎都不正确。

In[876]: import pandas as pd
    ...: 
    ...: df = pd.DataFrame('data': [1, 1, 2, 2, 1, 0, 0, -2, 0])
    ...: 
    ...: # Test 1, missing max in df.iloc[3], min correct
    ...: df['min'] = df.data[(df.data.shift(1) > df.data) & (df.data.shift(-1) > df.data)]
    ...: df['max'] = df.data[(df.data.shift(1) < df.data) & (df.data.shift(-1) < df.data)]
    ...: 
In[877]: df
Out[877]: 
   data  min  max
0     1  NaN  NaN
1     1  NaN  NaN
2     2  NaN  NaN
3     2  NaN  NaN
4     1  NaN  NaN
5     0  NaN  NaN
6     0  NaN  NaN
7    -2 -2.0  NaN
8     0  NaN  NaN
In[878]: 
In[878]: # Test 2, max incorrect, min incorrect
    ...: # max in iloc = 3, 6
    ...: # min in iloc = 1, 7
    ...: df['min'] = df.data[(df.data.shift(1) >= df.data) & (df.data.shift(-1) > df.data)]
    ...: df['max'] = df.data[(df.data.shift(1) <= df.data) & (df.data.shift(-1) < df.data)]
    ...: 
In[879]: df
Out[879]: 
   data  min  max
0     1  NaN  NaN
1     1  1.0  NaN
2     2  NaN  NaN
3     2  NaN  2.0
4     1  NaN  NaN
5     0  NaN  NaN
6     0  NaN  0.0
7    -2 -2.0  NaN
8     0  NaN  NaN

我想确定局部最小值和最大值,不是高原值。 正确的标识是:

iloc 2 或 3 中的最大值(无关紧要) iloc 7 中的最小值

一种解决方案是开始编写循环和 ifs/else,但它变得越来越难看......我的猜测是,使用 pandas 可能会有更简单的解决方案,但我缺乏一些专业知识,任何帮助将不胜感激。

我是 Python 和 Stack Overflow 的新手,所以我希望你能原谅任何新手的错误,干杯。

【问题讨论】:

为什么位置 6 的 max 不正确? 当你有 12344455332 时,唯一的局部最大值是 5 和 5? @DaniMesejo:iloc=6 处的最大值介于之前的最大值和 iloc=7 中的最小值之间,在新的局部最大值之前必须有一个局部最小值。 @Tarik:是的。我的示例中的问题是注册了高原(在本地最大值和最小值之间)。最小值和最大值成对出现或作为单个(本地)最大值或最小值出现。 (在你的例子中没有本地人,只有一个全局最大值) 【参考方案1】:

IIUC,您想对唯一的连续值应用局部最大值和最小值,请执行以下操作:

import pandas as pd

df = pd.DataFrame('data': [1, 1, 2, 2, 1, 0, 0, -2, 0])

# remove consecutive duplicates
res = df[df['data'] != df['data'].shift()]

# find min and max
res['min'] = res.data[(res.data.shift(1) > res.data) & (res.data.shift(-1) > res.data)]
res['max'] = res.data[(res.data.shift(1) < res.data) & (res.data.shift(-1) < res.data)]

# put back in original df
output = pd.concat((df, res[['min', 'max']]), axis=1)
print(output)

输出

   data  min  max
0     1  NaN  NaN
1     1  NaN  NaN
2     2  NaN  2.0
3     2  NaN  NaN
4     1  NaN  NaN
5     0  NaN  NaN
6     0  NaN  NaN
7    -2 -2.0  NaN
8     0  NaN  NaN

【讨论】:

以上是关于熊猫找到局部最大值和最小值,而不是高原值的主要内容,如果未能解决你的问题,请参考以下文章

Python在离散数据上查找局部最大值和最小值[重复]

查找熊猫索引数据帧的最小值和最大值

根据熊猫数据框中的条件获取最大值和最小值

如何找到所有数据框的最大值,最小值[不是列值,也不是行] [重复]

在 MySQL 中是不是可以找到最小值/最大值但首先删除异常值?

寻找局部最大值和最小值