python - 熊猫找到局部最大值和最小值,而不是高原值
问题描述
我需要在 pandas DataFrame 中找到局部最大值和最小值,起初看起来这与Pandas 找到局部最大值和最小值的问题相同,但建议的解决方案似乎都不正确。
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 的新手,所以我希望你能原谅任何新手的错误,干杯。
解决方案
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
推荐阅读
- javascript - 如何将swal模式中的标题调整到左上角
- django - 表格中的可点击行
- xcode - XCode UI 测试因“元数据不完整”而失败
- android - 本机脚本如何访问 10.0.2.2 android
- ebay-api - eBay Fulfillment API 不返回送货地址
- javascript - 在 Leaflet 中使用 MultiLineString 的问题
- javascript - 仅在浏览器上调用我自己的 Firbase 函数被 CORS 阻止
- c++ - 如何将项目从 Microsoft Visual Studio 6.0 转换为 Visual Studio 2017
- ansible - 如果值为真,则获取密钥
- javascript - 动态输入字段在变量中增加数字+1