如何在Pandas滚动窗口中标记中间值为子集最大值的行
实现方案
你可以直接通过pandas的rolling滚动窗口功能实现需求,完整代码如下:
import pandas as pd # 构造示例DataFrame df = pd.DataFrame({ 'time_index': range(1, 11), 'values': [21,5,25,0,4,13,20,2,15,21] }) # 核心逻辑:3大小滚动窗口,标签对齐中间位置,判断中间值是否为窗口最大值 df['is_peak'] = df['values'].rolling(window=3, center=True).apply( lambda x: x[1] == x.max(), raw=True ).astype('boolean') # 首尾无完整窗口的空值填充为False,可根据需求调整 df['is_peak'] = df['is_peak'].fillna(False)
参数说明
window=3:指定滚动窗口大小为3center=True:将窗口的计算结果对齐到窗口的中间位置,刚好匹配给中间值打标记的需求raw=True:传入lambda函数的参数为numpy数组,直接通过索引[1]取中间值,运行效率更高astype('boolean'):将apply默认返回的浮点类型转换为布尔类型,方便后续数据处理fillna(False):首尾两个位置无法形成完整的3元素窗口,默认返回空值,这里统一填充为False
运行后输出的df结果如下,完全匹配你给出的示例逻辑:
| 索引 | time_index | values | is_peak |
|---|---|---|---|
| 0 | 1 | 21 | False |
| 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 | False |
内容的提问来源于stack exchange,提问作者Alejandro A
相关产品推荐
相关产品推荐

