熊猫分组累积总和到阈值

时间:2019-09-26 14:43:51

标签: pandas pandas-groupby cumsum

使用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 <31)。

对于组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

1 个答案:

答案 0 :(得分:0)

我在这里使用np.sign -1表示小于,0表示相等,1表示较大

d={x : y for x , y in df.groupby(np.sign(df.groupby('a').b.cumsum()-df.c))}
d
Out[30]: 
{-1:    a   b   c
 0  z   5  15
 3  x  10  31
 4  x  20  31, 0:    a   b   c
 1  z  10  15, 1:    a  b   c
 2  z  2  15
 5  x  5  31}

获得d[0], d[1],d[-1]