这是我的数据框:
import pandas as pd
df = pd.DataFrame(
{
'a': [3, 1, 2, 5, 10, 3, 13, 3, 2],
}
)
预期输出是创建一个a_max
和a_min
:
a a_max a_min
0 3 NaN NaN
1 1 3 1
2 2 3 1
3 5 3 1
4 10 3 1
5 3 10 3
6 13 10 3
7 3 13 3
8 2 13 2
逻辑:
我逐行解释逻辑。有一个动态窗口,对于df
窗口的第一个实例,只考虑第一行。对于窗口的第二个实例,考虑前两行。如下所示:
这是前四个窗口。它会相应扩展。
对于每个窗口,我需要找到最大值,然后找到低于该最大值的最小值。
我从黄色窗口开始解释。这个窗口的最大值是 3,其下方的最小值是 1。这就是为什么这个窗口的a_max
和a_min
是 3 和 1。
现在对于橙色窗口,最大值为 5,但由于此窗口中没有低于此值且小于 5 的值,因此重复前一个a_max
和。a_min
该逻辑对于其余行也同样适用。
这是我的尝试:
df['a_max'] = df.a.cummax()
df['a_min'] = df.a.cummin()
这是一个棘手的问题,我会使用
cummax
+shift
,然后mask
+ffill
来计算a_max
。然后a_min
是groupby.cummin
每组相同的a_max
:输出:
中间体: