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

如何实现pandas中从起始到当前行的可变长度rolling窗口?

嘿,这个需求我太熟了!你要的其实是累积滚动窗口——也就是从数据的第一个条目开始,一直扩展到当前行的可变长度窗口,和固定大小的rolling()窗口刚好相反。下面我给你几种实用的实现方法,都是pandas里常用的操作:

方法1:用expanding()方法(最直接高效)

pandas专门提供了expanding()来处理这种“从开头累积到当前行”的窗口需求,它的窗口会自动从第一个元素开始,每一行都包含之前所有的条目。

举个实际例子:

import pandas as pd

# 创建示例DataFrame
df = pd.DataFrame({'x': [1, 2, 3, 4, 5]})

# 生成每一行对应的累积窗口内容
df['rolling_window'] = df['x'].expanding().apply(lambda window: window.tolist(), raw=False)
print(df)

输出结果如下:

x rolling_window
0 1 [1]
1 2 [1, 2]
2 3 [1, 2, 3]
3 4 [1, 2, 3, 4]
4 5 [1, 2, 3, 4, 5]

这里要注意raw=False的设置:默认raw=True会把窗口转成numpy数组,用raw=False可以保留Series对象,方便我们直接转成列表。

方法2:手动构造索引切片(灵活度拉满)

如果你需要对窗口做更复杂的自定义操作(比如过滤特定值、转换数据格式),手动遍历索引切片会更灵活:

# 手动生成累积窗口
df['manual_window'] = [df['x'].iloc[:i+1].tolist() for i in range(len(df))]
print(df['manual_window'])

这种方法的好处是,你可以在切片后直接对窗口数据做任何处理,比如:

# 示例:只保留窗口中的偶数
df['even_window'] = [df['x'].iloc[:i+1][df['x'].iloc[:i+1] % 2 == 0].tolist() for i in range(len(df))]
方法3:直接用累积统计函数(针对计算需求)

如果你的需求不是获取窗口内容,而是计算累积统计值(比如求和、均值、最大值),那完全不用转列表,直接用expanding()的聚合函数更高效:

# 计算累积均值
df['cumulative_mean'] = df['x'].expanding().mean()
# 计算累积求和
df['cumulative_sum'] = df['x'].expanding().sum()
# 计算累积最大值
df['cumulative_max'] = df['x'].expanding().max()

print(df[['x', 'cumulative_mean', 'cumulative_sum', 'cumulative_max']])

输出结果:

x cumulative_mean cumulative_sum cumulative_max
0 1 1.0 1 1
1 2 1.5 3 2
2 3 2.0 6 3
3 4 2.5 10 4
4 5 3.0 15 5

另外提个小细节:如果你的数据有缺失值,可以通过min_periods参数控制窗口的最小元素数量,比如expanding(min_periods=2)表示至少要有2个非NaN元素才会计算,默认min_periods=1,所以一般场景下不用额外设置。

要是你还有更特殊的需求(比如想从第n行才开始累积、或者自定义窗口起始点),随时说,我再给你调整方案~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 09:09:27