使用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
答案 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]