首页 > 解决方案 > 在“移动子集”(滚动窗口?)中标记具有最大值的行

问题描述

如果我有数据框:

   '|    |   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]。这个逻辑实现到列值我想检查中间的值是否是子集的最大值并将其标记在另一列中。

迭代:

  1. 值:[21,5,25],最大值(值)== 5?错误 => 忽略。
  2. 值:[5,25,0],最大值(值)= 25?True => 在新列中添加标志。

我觉得这与滚动窗口有关,但我不知道该怎么做。

标签: pythonpandas

解决方案


要进行滚动窗口计算,请使用该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>

推荐阅读