python - 在“移动子集”(滚动窗口?)中标记具有最大值的行
问题描述
如果我有数据框:
'| | time_index | values |
|---:|-------------:|---------:|
| 0 | 1 | 21 |
| 1 | 2 | 5 |
| 2 | 3 | 25 |
| 3 | 4 | 0 |
| 4 | 5 | 4 |
| 5 | 6 | 13 |
| 6 | 7 | 20 |
| 7 | 8 | 2 |
| 8 | 9 | 15 |
| 9 | 10 | 21 |'
我想以 1 为增量获取 3 的所有子集,因此第一个操作采用索引 [0,1,2],第二次迭代采用 [1,2,3]。这个逻辑实现到列值我想检查中间的值是否是子集的最大值并将其标记在另一列中。
迭代:
- 值:[21,5,25],最大值(值)== 5?错误 => 忽略。
- 值:[5,25,0],最大值(值)= 25?True => 在新列中添加标志。
我觉得这与滚动窗口有关,但我不知道该怎么做。
解决方案
要进行滚动窗口计算,请使用该rolling
方法。agg
然后,您可以使用自定义函数将逻辑应用于每个组。
# val.iat[1] stands for the middle value of each group
df['is_max'] = (
df['values'].rolling(window=3, center=True)
.agg(lambda vals: vals.iat[1] == vals.max())
.astype('boolean')
)
>>> df
time_index values is_max
0 1 21 <NA>
1 2 5 False
2 3 25 True
3 4 0 False
4 5 4 False
5 6 13 False
6 7 20 True
7 8 2 False
8 9 15 False
9 10 21 <NA>
推荐阅读
- php - 如何在运行脚本时禁用 opcache.enable_cli?
- python - 如何遍历列表列表并在每个列表中选择随机元素?
- node.js - 将猫鼬查找与动态查询一起使用
- algorithm - 根据所需的平均颜色编辑图像
- visual-studio-2017 - VS2019 包与项目参考(最小版本)
- node.js - 有没有办法在护照js中为不同路由的不同用户实现不同的身份验证策略?
- c# - Scenario 和 Scenario outline 有什么区别?
- typescript - Typescript GRPC 客户端拦截器
- typescript - TypeScript 在对未知变量进行类型检查后仍会触发错误 ts2571
- flutter - 在调试和配置文件模式下工作正常,在发布模式下不工作