首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >熊猫Cumsum条件复位

熊猫Cumsum条件复位
EN

Stack Overflow用户
提问于 2020-05-04 10:25:58
回答 3查看 1.5K关注 0票数 1

我正在使用一个现有的解决方案来尝试生成一个累加和,在某个值之后重置(在本例中是>= 16)。目前,我得到了以下输出,但在某些情况下,累积和仍然大于16。

代码语言:javascript
复制
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

我使用的代码是:

代码语言:javascript
复制
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

有什么办法纠正这个问题吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-05-04 10:46:28

代码语言:javascript
复制
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

结果:

代码语言:javascript
复制
    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
票数 2
EN

Stack Overflow用户

发布于 2020-05-04 10:50:16

在这里,接受的答案略有变化:Perfrom cumulative sum over a column but reset to 0 if sum become negative in Pandas可以帮助您解决这个问题。

由于该解决方案使用numba,它将比正常的iterrows解决方案快得多。

代码语言:javascript
复制
@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]
票数 1
EN

Stack Overflow用户

发布于 2020-05-04 11:01:24

我认为,一个好的解决方案是对您感兴趣的列中的每个值应用“带内存的函数”。

定义以下函数来计算和:

代码语言:javascript
复制
def myCumSum(val):
    myCumSum.sum += val
    if myCumSum.sum > 16:
        myCumSum.sum = val
    return myCumSum.sum

请注意,该函数有一个属性(sum),应该在该函数的第一次调用之前设置该属性。

代码语言:javascript
复制
myCumSum.sum = 0

然后将其应用于Size列,并将结果保存为累计列:

代码语言:javascript
复制
df['cumsum'] = df.Size.apply(myCumSum)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61590055

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档