如何解决达到某个值后重置累积总和并将标志设置为 1
我无法想出一种方法来对列执行累积总和并在达到某个值后创建标志。
所以给定一个数据框:
df = pd.DataFrame([[5,1],[6,[30,[170,0],[5,[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 列,如果达到最大值,我想执行累积总和并将“Flag”列值设置为 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
任何帮助将不胜感激!
解决方法
“普通”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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。