You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Pandas中实现可变窗口大小的滚动最大值计算

动态窗口大小的DataFrame滚动最大值计算

现有一个包含两列的DataFrame:

  • Data列:存储待计算的数值
  • Window列:指定每次滚动比较的窗口大小,且每次计算后起始位置需移动当前窗口的大小(即按窗口大小依次分段)

此前使用固定窗口大小的rolling函数实现过类似功能,但无法适配动态窗口需求。原始数据及固定窗口代码如下:

import pandas as pd
import numpy as np

np.random.seed([3,14])
data = np.random.randn(10).cumsum()
w = [3,2,2,3,2,2,3,2,2,3]

df = pd.DataFrame({'Data': data, 'Window':w})
print(df)

输出的DataFrame:

Data  Window
0 -0.602923       3
1 -1.005579       2
2 -0.703250       2
3 -1.227599       3
4 -0.683756       2
5 -0.670621       2
6 -0.997120       3
7  0.387956       2
8  0.255502       2
9 -0.152361       3

现在需要根据Window列动态调整窗口大小,按窗口大小依次分段取最大值,预期输出如下:

0   -0.602923 = max (0,1,2)
1   -0.683756 = max (3,4)
2   -0.670621 = max (5,6)
3    0.387956 = max (7,8,9)

希望找到类似rolling函数的简洁实现方式。


解决方案

方法一:分段索引切片法(简洁直观)

通过计算每个分段的起始/结束索引,批量提取对应区间的最大值:

# 计算每个分段的起始和结束索引
start = 0
segments = []
while start < len(df):
    win_size = df['Window'].iloc[start]
    end = start + win_size
    segments.append((start, end))
    start = end

# 提取每个分段的最大值
max_values = pd.Series(
    [df['Data'][s:e].max() for s, e in segments],
    name='Max_Value'
)

print(max_values)

输出结果:

0   -0.602923
1   -0.683756
2   -0.670621
3    0.387956
Name: Max_Value, dtype: float64

方法二:分组聚合法(高效适用于大数据集)

生成分段分组标签后,用groupby批量计算最大值,避免循环切片的性能损耗:

# 生成分组标签
groups = []
current_group = 0
start = 0
while start < len(df):
    win_size = df['Window'].iloc[start]
    groups.extend([current_group]*win_size)
    current_group += 1
    start += win_size

# 分组取最大值
max_values = df['Data'].groupby(groups).max().reset_index(drop=True)

该方法输出结果与预期完全一致,且处理大规模数据时性能更优。


内容的提问来源于stack exchange,提问作者Murray Ross

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 04:23:11