重置 基于条件的累积总和 潘达斯[英] Reset Cumulative sum base on condition Pandas

本文是小编为大家收集整理的关于重置 基于条件的累积总和 潘达斯的处理方法,想解了重置 基于条件的累积总和 潘达斯的问题怎么解决?重置 基于条件的累积总和 潘达斯问题的解决办法?那么可以参考本文帮助大家快速定位并解决问题。

问题描述

我有一个数据框架,例如:

customer spend hurdle 
A         20    50      
A         31    50      
A         20    50      
B         50    100     
B         51    100    
B         30    100     

我想计算累积的其他列,当累积总和更大或等于障碍时,它将重置在同一客户上的基础:

:

customer spend hurdle Cumulative 
A         20    50      20
A         31    50      51
A         20    50      20
B         50    100     50
B         51    100    101
B         30    100     30

我在熊猫中使用了cumsum和groupby,但我不知道如何将其重置在条件下.

以下是我目前正在使用的代码:

df1['cum_sum'] = df1.groupby(['customer'])['spend'].apply(lambda x: x.cumsum())

我知道这只是正常的累积总和.我非常感谢您的帮助.

推荐答案

可能会有更快,有效的方法.这是一种效率低下的apply做的方法.

In [3270]: def custcum(x):
      ...:     total = 0
      ...:     for i, v in x.iterrows():
      ...:         total += v.spend
      ...:         x.loc[i, 'cum'] = total
      ...:         if total >= v.hurdle:
      ...:            total = 0
      ...:     return x
      ...:

In [3271]: df.groupby('customer').apply(custcum)
Out[3271]:
  customer  spend  hurdle    cum
0        A     20      50   20.0
1        A     31      50   51.0
2        A     20      50   20.0
3        B     50     100   50.0
4        B     51     100  101.0
5        B     30     100   30.0

您可以考虑使用cython或numba来加快custcum


[更新]

改进的版本的 ido s 答案.

In [3276]: s = df.groupby('customer').spend.cumsum()

In [3277]: np.where(s > df.hurdle.shift(-1), s, df.spend)
Out[3277]: array([ 20,  51,  20,  50, 101,  30], dtype=int64)

其他推荐答案

一种方法是以下代码.但这是一个非常效率且不高的单线.

df1.groupby('customer').apply(lambda x: (x['spend'].cumsum() *(x['spend'].cumsum() > x['hurdle']).astype(int).shift(-1)).fillna(x['spend']))

本文地址:https://www.itbaoku.cn/post/1728022.html