【问题标题】:Resetting Cumulative Sum once a value is reached and set a flag to 1达到某个值后重置累积和并将标志设置为 1
【发布时间】:2021-05-22 15:36:49
【问题描述】:

我无法想出一种方法来对列执行累积求和并在达到某个值时创建一个标志。

所以给定一个数据框:

df = pd.DataFrame([[5,1],[6,1],[30,1],[170,0],[5,1],[10,1]],columns = ['a','b'])

     a  b
0    5  1
1    6  1
2   30  1
3  170  0
4    5  1
5   10  1

对于 A 列,如果达到最大值,我想执行累积和并将“标志”列值设置为 1。达到最大值后,它将重置为 0。在这种情况下,最大值为 40。任何超过 40 的累积总和都会触发重置

Desired Output

     a  b  Flag
0    5  1     0
1   11  1     0
2   41  1     1
3  170  0     1
4    5  1     0
5   15  1     0

任何帮助将不胜感激!

【问题讨论】:

标签: pandas cumulative-sum


【解决方案1】:

“普通”cumsum() 在这里没用,因为这个函数“不知道” 在哪里重新开始求和。

您可以使用以下自定义函数来实现:

def myCumSum(x, thr):
    if myCumSum.prev >= thr:
        myCumSum.prev = 0
    myCumSum.prev += x
    return myCumSum.prev

这个函数是“带内存的”(来自上一次调用) - prev,所以有 是一种“知道”从哪里重新开始的方法。

要加快执行速度,请定义此函数的矢量化版本:

myCumSumV = np.vectorize(myCumSum, otypes=[np.int], excluded=['thr'])

然后执行:

threshold = 40
myCumSum.prev = 0  # Set the "previous" value
# Replace "a" column with your cumulative sum
df.a = myCumSumV(df.a.values, threshold)
df['flag'] = df.a.ge(threshold).astype(int)  # Compute "flag" column

结果是:

     a  b  flag
0    5  1     0
1   11  1     0
2   41  1     1
3  170  0     1
4    5  1     0
5   15  1     0

【讨论】:

  • 感谢您的详细解释!
猜你喜欢
  • 1970-01-01
  • 2018-07-12
  • 2018-07-12
  • 1970-01-01
  • 2021-04-10
  • 1970-01-01
  • 2020-03-30
  • 2021-03-26
  • 1970-01-01
相关资源
最近更新 更多