【发布时间】:2021-01-02 04:49:18
【问题描述】:
我有一个名为“df”的数据框。它看起来像这样:
a
0 2
1 3
2 0
3 5
4 1
5 3
6 1
7 2
8 2
9 1
我想生成一个累计和列:
- 累加“a”列的内容;
- 直到总和为“5”;
- 当总和达到“5”时将总和重置为 0,并继续求和过程;
我希望数据框看起来像这样:
a a_cumm_sum
0 2 2
1 3 5
2 0 0
3 5 5
4 1 1
5 3 4
6 1 5
7 2 2
8 2 4
9 1 5
在数据框中,“a_cumm_summ”列包含累积和的结果。
有谁知道我如何做到这一点?我已经通过论坛搜索了。并且看到了类似的问题,例如this one,但它们并不符合我的确切要求。
【问题讨论】:
-
这样的条件使得向量化的方法在这里很难使用,我可能会考虑使用
numba,它可以让您加快速度并将其编写为显式循环。 -
对于撰写此评论时显示的解决方案,我使用
import pandas as pd; import numpy as np; np.random.seed(365); df = pd.DataFrame({'a': [np.random.randint(5) for _ in range(3000000)]})测试了每个解决方案。虽然所有解决方案都适用于来自 OP 的测试数据,但当两行的cumsum大于 5 时,只有来自 U11-Forward 的 solution 正确地将cumsum重置为 0。
标签: python pandas rolling-computation cumsum