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
相关产品推荐
相关产品推荐

