python - 如何在熊猫中同时进行向前和向后滚动?
问题描述
我需要检查当前值是否高于接下来的两个和前三个值。否则,它通过前一个数字。
前任:
日期 | 位置 |
---|---|
2007-01-01 | 3.0 |
2007-01-02 | 5.0 |
2007-01-03 | 6.0 |
2007-01-10 | 11.0 |
2007-01-11 | 9.0 |
2007-01-20 | 8.0 |
2007-01-21 | 10.0 |
2007-01-22 | 13.0 |
2007-01-23 | 4.0 |
2007-01-27 | 2.0 |
2007-01-28 | 1.0 |
2007-01-29 | 2.0 |
至
日期 | 位置 |
---|---|
2007-01-01 | 不适用 |
2007-01-02 | 不适用 |
2007-01-03 | 不适用 |
2007-01-10 | 11.0 |
2007-01-11 | 11.0 |
2007-01-20 | 11.0 |
2007-01-21 | 11.0 |
2007-01-22 | 13.0 |
2007-01-23 | 13.0 |
2007-01-27 | 13.0 |
2007-01-28 | 13.0 |
2007-01-29 | 13.0 |
我知道如何分别进行向后滚动和向前滚动。但无法弄清楚如何同时做到这一点。
解决方案
您可以使用np.where
替换未通过您的条件的值,nan
然后使用ffill
将先前的值向前转换。
在这种情况下,我们使用最小周期为 4 的第一个条件的扩展窗口,而对于第二个条件,我们反转数据并执行 2 的滚动窗口。
import pandas as pd
import numpy as np
df = pd.DataFrame({'date': {0: '2007-01-01',
1: '2007-01-02', 2: '2007-01-03', 3: '2007-01-10', 4: '2007-01-11',
5: '2007-01-20', 6: '2007-01-21', 7: '2007-01-22', 8: '2007-01-23',
9: '2007-01-27', 10: '2007-01-28', 11: '2007-01-29'},
'pos': {0: 3.0, 1: 5.0, 2: 6.0, 3: 11.0, 4: 9.0, 5: 8.0,
6: 10.0, 7: 13.0, 8: 4.0, 9: 2.0, 10: 1.0, 11: 2.0}})
df.pos = np.where((df.pos.ge(df.pos.rolling(len(df), min_periods=4).max())) &
(df.pos.ge(df.iloc[::-1].pos.rolling(2).max())),
df.pos,np.nan)
df.ffill()
输出
date pos
0 2007-01-01 NaN
1 2007-01-02 NaN
2 2007-01-03 NaN
3 2007-01-10 11.0
4 2007-01-11 11.0
5 2007-01-20 11.0
6 2007-01-21 11.0
7 2007-01-22 13.0
8 2007-01-23 13.0
9 2007-01-27 13.0
10 2007-01-28 13.0
11 2007-01-29 13.0
推荐阅读
- c - 如何使用通用动态数组实现堆栈?
- android - 在 MaterialSearchView 中第二次搜索时出现错误的元素
- jenkins - 如何使用 Jenkins 声明式管道将构建变量作为属性传递给 MSBuild?
- r - 从 stargazer 顶部摆脱“table.1”
- javascript - SetInterval 被多次调用
- sql-server - 修改 SQL 表中的现有小数位
- python - CNN对象定位
- google-apps-script - 无法使用 Apps 脚本从团队云端硬盘中删除文件
- javascript - Setting cookie in iframe when using safari
- python - Fastest way to draw pixels to screen in python