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

Pandas滚动窗口获取首尾值报错ValueError,求正确实现方法

问题解决:Pandas滚动窗口获取首尾值

错误原因

你遇到的ValueError: 0 is not in range,是因为Pandas的rolling窗口聚合中,传给agg的lambda参数是保留原始DataFrame索引的Series,不是从0开始的位置序列。比如窗口包含索引0、1、2的行时,这个Series的索引是[0,1,2],用rows[0]能取到值,但窗口轮到索引1、2、3时,你用rows[0]会找不到对应索引,直接报错。

正确实现方式

1. 获取滚动窗口最后一个值

滚动窗口的最后一个值就是当前行的val值,也可以用官方提供的last()方法,效果完全一致:

d['last'] = d['val'].rolling(3).last()
# 等价于 d['last'] = d['val'](窗口大小3时,前两行是NaN,第三行开始等于当前val)

2. 获取滚动窗口第一个值

有两种实用的实现方式:

  • 方法一:用iloc[0]按位置取首元素
    用apply配合iloc(基于位置的索引)来取窗口第一个元素,不受原始索引影响:

    d['first'] = d['val'].rolling(3).apply(lambda x: x.iloc[0], raw=False)
    

    注意要加raw=False,确保传入的是Series而非数组,才能使用iloc。

  • 方法二:用shift方法(性能更优)
    当窗口大小固定为3时,当前行的滚动窗口第一个元素就是往前数第2行的值,直接用shift可以避免逐窗口的apply计算,效率更高:

    d['first'] = d['val'].shift(2)
    

完整代码示例

import pandas as pd

d = pd.DataFrame.from_dict({'ix':[0,1,2,3,4,5], 'val': [1,-2,5,4,9,6]})

# 获取滚动窗口第一个值(两种方法选其一)
d['first'] = d['val'].rolling(3).apply(lambda x: x.iloc[0], raw=False)
# d['first'] = d['val'].shift(2)  # 更高效的方式

# 获取滚动窗口最后一个值
d['last'] = d['val'].rolling(3).last()

print(d)

输出结果

ix  val  first  last
0   0    1    NaN   NaN
1   1   -2    NaN   NaN
2   2    5    1.0   5.0
3   3    4   -2.0   4.0
4   4    9    5.0   9.0
5   5    6    4.0   6.0

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 12:43:21