【发布时间】:2019-09-26 14:43:51
【问题描述】:
在 Pandas 中使用 groupby 操作,是否可以使用 cumsum 函数达到(或超过一条记录)阈值?
目标是至少达到或超过阈值,然后停止进一步积累。
示例数据框:
import pandas as pd
data = [
{'a':'z', 'b': 5, 'c': 15}, {'a':'z', 'b': 10, 'c': 15},
'a':'z', 'b': 2, 'c': 15},
{'a': 'x', 'b': 10, 'c':31}, {'a':'x', 'b': 20, 'c': 31}, {'a':'x',
'b': 5, 'c': 31, {'a':'x', 'b': 9, 'c': 31}
]
df = pd.DataFrame(data)
df:
a b c
0 z 5 15
1 z 10 15
2 z 2 15
3 x 10 31
4 x 20 31
5 x 5 31
6 x 9 31
我能想象的唯一方程没有达到或超过 X 组的阈值:
df[df.groupby(by='a')['b'].cumsum()<=df['c']]
a b c
0 z 5 15
1 z 10 15
3 x 10 31
4 x 20 31
它适用于组 z(即 5+10 = 15),但不适用于组 x b/c(即 10+20
对于 x 组,我需要达到(或超过一条记录)31 的值。所以下一条记录也应该累积(即 10+20+5 >= 31 但请注意它停止进一步累积(即也不需要 9)。
有没有一种方法可以应用累积运算来满足或超过单个记录的基准?
预期/期望的结果:
a b c
0 z 5 15
1 z 10 15
3 x 10 31
4 x 20 31
5 x 5 31
【问题讨论】:
-
你能显示预期的输出吗?
-
为什么第 5 行在您的预期输出中?
-
@lostcode 因为 10+20=30 小于 31,所以包括 5 的下一条记录导致 35 至少等于或超过仅一条记录。
标签: pandas pandas-groupby cumsum