【问题标题】:Python reset cumulative sum over intervals in a columnPython重置列中间隔的累积总和
【发布时间】:2020-03-12 00:04:27
【问题描述】:

我正在尝试按间隔进行累积总和,即。如果下一个要累加的值为 0,则 cumsum 被重置为零。下面是一个示例,下面是所需的结果。我曾尝试使用 numpy 'convolve' 和 'groupby' 但无法想出一种方法来进行重置,除非创建一个循环遍历所有行的 def。我缺少一个聪明的方法吗?请注意,“x”列中的实数数据是由 0 分隔的实数。

import numpy as np
import pandas as pd

a = pd.DataFrame([[0,0],[1,0],[1,0],[1,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],\
[0,0],[0,0],[0,0],[0,0],[1,0],[1,0],[0,0]], columns=["x","y"])

def patch(k):
  k["z"] = k.x.cumsum()
  return k

print(patch(a))

当前输出:

    x  y  z
0   0  0  0
1   1  0  1
2   1  0  2
3   1  0  3
4   0  0  3
6   0  0  3
7   0  0  3
9   0  0  3
10  0  0  3
12  0  0  3
13  1  0  4
15  1  0  5
16  0  0  5

期望的输出:

    x  y  z
0   0  0  0
1   1  0  1
2   1  0  2
3   1  0  3
4   0  0  0
6   0  0  0
7   0  0  0
9   0  0  0
10  0  0  0
12  0  0  0
13  1  0  1
15  1  0  2
16  0  0  0

【问题讨论】:

    标签: python pandas cumsum


    【解决方案1】:

    在 cumsum 上进行分组:

    a['z'] = a.groupby(a['x'].eq(0).cumsum())['x'].cumsum()
    

    输出:

        x  y  z
    0   0  0  0
    1   1  0  1
    2   1  0  2
    3   1  0  3
    4   0  0  0
    6   0  0  0
    7   0  0  0
    9   0  0  0
    10  0  0  0
    12  0  0  0
    13  1  0  1
    15  1  0  2
    16  0  0  0
    

    【讨论】:

    • @uMdRupert y 和这有什么关系?
    • 有史以来最快的答案。还没有弄清楚它是如何工作的,但是谢谢。
    • @QuangHoang 我认为如果下一个总和值为 0,而不是下一个 x 值,则操作希望重置 cumsum。 IE。如果y4 行中为1,则cumsum 应增加到4。不完全确定,但这是我对这个问题的解释。
    • @uMdRupert 你预料到我的下一个问题。我想先知道如何为一列做。
    • @MikeB2019x 如果您希望另一列将x 替换为ygroupby 内,即a.groupby(a['y'].eq(0).cumsum())['x'].cumsum()
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-02
    • 1970-01-01
    相关资源
    最近更新 更多