这是一个使用np.bincount 处理通用元素数量的 NumPy 方法 -
pd.Series(np.bincount(np.arange(s1.size)//3, s1))
示例运行 -
In [42]: s1 = pd.Series([1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 9, 5])
In [43]: pd.Series(np.bincount(np.arange(s1.size)//3, s1))
Out[43]:
0 3.0
1 6.0
2 9.0
3 12.0
4 14.0
dtype: float64
如果我们真的渴望性能以及系列的长度可以被窗口长度整除的情况,我们可以使用s1.values,然后reshape,最后使用np.einsum来查看系列求和,就像这样 -
pd.Series(np.einsum('ij->i',s.values.reshape(-1,3)))
与@Nickil Maveli's post 中使用的基准数据集相同的时间 -
In [140]: s = pd.Series(np.repeat(np.arange(10**5), 3))
# @Nickil Maveli's soln
In [141]: %timeit pd.Series(np.add.reduceat(s.values, np.arange(0, s.shape[0], 3)))
100 loops, best of 3: 2.07 ms per loop
# Using views+sum
In [142]: %timeit pd.Series(s.values.reshape(-1,3).sum(1))
100 loops, best of 3: 2.03 ms per loop
# Using views+einsum
In [143]: %timeit pd.Series(np.einsum('ij->i',s.values.reshape(-1,3)))
1000 loops, best of 3: 1.04 ms per loop