【问题标题】:Pandas groupby cumulative sum to thresholdPandas groupby 累计总和到阈值
【发布时间】: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


【解决方案1】:

这里我使用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]

【讨论】:

  • 正如所写,这似乎返回所有记录,而不是满足条件的记录子集。不要认为我在原始问题中提供了足够的背景信息。添加了更多细节
  • @JacamoFinane 这个返回 dict ,你需要通过 d[0] , d[1],d[-1] 获取 df
  • 谢谢。新来的。这是一个包含数百万条记录的数据框,我希望返回满足条件的数据框。也许 cumsum 在这里不起作用,因为它按排序顺序累积记录。
猜你喜欢
  • 2014-05-04
  • 1970-01-01
  • 2018-07-04
  • 2023-01-30
  • 2017-08-01
  • 2020-03-30
  • 2018-01-21
相关资源
最近更新 更多