如果我有以下数据帧,派生如下:df = pd.DataFrame(np.random.randint(0, 10, size=(10, 1)))
0
0 0
1 2
2 8
3 1
4 0
5 0
6 7
7 0
8 2
9 2
有没有一种有效的方法cumsum
行有一个限制,并且每次达到这个限制时,就开始一个新的cumsum
。在达到每个限制(不管行数是多少)之后,将创建一个包含总累计数的行。在
下面我创建了一个这样做的函数的例子,但是它非常慢,特别是当数据帧变得非常大的时候。 我不喜欢我的函数是循环的,我正在寻找一种方法使它更快(我猜是一种没有循环的方法)。在
^{pr2}$如果你像这样使用我的函数:foo(df, 5)
在上述上下文中,它返回:
0
2 10
6 8
循环无法避免,但可以使用
numba
的njit
并行化:这里需要索引,假设您的索引不是数字/单调递增的。在
^{pr2}$如果索引是
Int64Index
类型,可以将其缩短为:njit
函数性能log-log图显示,对于较大的输入,generator函数更快:
一种可能的解释是,随着N的增加,在
dynamic_cumsum2
中向一个不断增长的列表追加内容的开销变得突出。而cumsum_limit_nb
只需要yield
。在循环不一定是坏的。诀窍是确保它是在低级对象上执行的。在这种情况下,可以使用Numba或Cython。例如,使用带有
numba.njit
的生成器:要演示使用Numba进行JIT编译的性能优势:
^{pr2}$更简单的方法:
结果:
^{pr2}$相关问题 更多 >
编程相关推荐