我正在使用一个现有的解决方案来尝试生成一个累加和,在某个值之后重置(在本例中是>= 16)。目前,我得到了以下输出,但在某些情况下,累积和仍然大于16。
Size cumsum
8 8
8 16 ---correct
8 8
8 16 ---correct
7 7
6 13 (should be reset here since next value causes cumsum >16)
7 20 ---incorrect
6 6
5 11
2 13我使用的代码是:
df = pd.DataFrame({'Size':[8,8,8,8,7,6,7,6,5,2]})
ls = []
cumsum = 0
last_reset = 0
for _, row in df.iterrows():
cumsum = cumsum + row.Size
ls.append(cumsum)
if cumsum >= 16:
last_reset = cumsum
cumsum = 0
df['cumsum'] = ls有什么办法纠正这个问题吗?
发布于 2020-05-04 10:46:28
df = pd.DataFrame({'Size':[8,8,8,8,7,6,7,6,5,2]})
ls = []
cumsum = 0
last_reset = 0
for _, row in df.iterrows():
if cumsum + row.Size <= 16:
cumsum += row.Size
else:
last_reset = cumsum
cumsum = row.Size
ls.append(cumsum)
df['cumsum'] = ls结果:
Size cumsum
0 8 8
1 8 16
2 8 8
3 8 16
4 7 7
5 6 13
6 7 7
7 6 13
8 5 5
9 2 7发布于 2020-05-04 10:50:16
在这里,接受的答案略有变化:Perfrom cumulative sum over a column but reset to 0 if sum become negative in Pandas可以帮助您解决这个问题。
由于该解决方案使用numba,它将比正常的iterrows解决方案快得多。
@njit
def cumli(x, lim):
total = 0
result = []
for i, y in enumerate(x):
total += y
if (total) > lim:
total = y
result.append(total)
return result
cumli(df.Size.values, 16)
# [8, 16, 8, 16, 7, 13, 7, 13, 5, 7]发布于 2020-05-04 11:01:24
我认为,一个好的解决方案是对您感兴趣的列中的每个值应用“带内存的函数”。
定义以下函数来计算和:
def myCumSum(val):
myCumSum.sum += val
if myCumSum.sum > 16:
myCumSum.sum = val
return myCumSum.sum请注意,该函数有一个属性(sum),应该在该函数的第一次调用之前设置该属性。
myCumSum.sum = 0然后将其应用于Size列,并将结果保存为累计列:
df['cumsum'] = df.Size.apply(myCumSum)https://stackoverflow.com/questions/61590055
复制相似问题