熊猫找到局部最大值和最小值,而不是高原值
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
【讨论】:
以上是关于熊猫找到局部最大值和最小值,而不是高原值的主要内容,如果未能解决你的问题,请参考以下文章
如何找到所有数据框的最大值,最小值[不是列值,也不是行] [重复]