【问题标题】:Cumsum on Pandas DF with reset to zero for negative cumulative valuesPandas DF 上的 Cumsum 对于负累积值重置为零
【发布时间】:2021-03-21 05:17:30
【问题描述】:

我在 Pandas DF 中有一个时间顺序分组表。我正在尝试在组内创建一个运行总和,条件是运行总和不能为负数,即当运行总和变为负数时列单元格值重置为零,并继续运行总和计算以保持完整性和数据质量。

我已将 cumsum() 与 groupby() 函数一起使用,但似乎无法即时将累积值重置为零。我也查看了下面的线程,但这与稍微不同的问题有关:

Pandas dataframe - running sum with reset

以下是代码(包含我一直在使用的示例数据):

group = ['A', 'A', 'A', 'A', 'A', 'B', 'B', 'B', 'C', 'C', 'C', 'C']
values = [-5, 4, 2, -4, -2, -2, 5, -2, 3, 6, 7, -11]
df = pd.DataFrame(list(zip(group, values)), columns =['group', 'val'])
df['cumsum_output'] = df.groupby('group')['val'].cumsum()
df['expected_out'] = [0, 4, 6, 2, 0, 0, 5, 3, 3, 9, 16, 5]

    group   val    cumsum_output    expected_out
0   A        -5               -5               0
1   A         4               -1               4
2   A         2                1               6
3   A        -4               -3               2
4   A        -2               -5               0
5   B        -2               -2               0
6   B         5                3               5
7   B        -2                1               3
8   C         3                3               3
9   C         6                9               9
10  C         7               16              16
11  C       -11                5               5

['cumsum_output' 是我从当前代码中得到的; 'expected_out' 是我理想中想要达到的目标。] 感谢任何对解决此问题有更好想法和建议的人的帮助和建议:-)

干杯,

纳德

【问题讨论】:

    标签: python pandas pandas-groupby cumsum


    【解决方案1】:

    让我们试试吧:

    neg = df['val'] < 0
    df['output'] = df['val'].groupby([neg[::-1].cumsum(),df['group']]).cumsum().clip(0)
    

    输出:

       group  val  cumsum_output  expected_out  output
    0      A   -5             -5             0       0
    1      A    4             -1             4       4
    2      A    2              1             6       6
    3      A   -4             -3             2       2
    4      A   -2             -5             0       0
    5      B   -2             -2             0       0
    6      B    5              3             5       5
    7      B   -2              1             3       3
    8      C    3              3             3       3
    9      C    6              9             9       9
    10     C    7             16            16      16
    11     C  -11              5             5       5
    

    【讨论】:

    • 谢谢。有效!现在,我必须去阅读文档以完全理解这段代码到底在做什么。感谢您的帮助! :-)
    猜你喜欢
    • 1970-01-01
    • 2018-12-04
    • 2018-12-27
    • 1970-01-01
    • 2019-08-10
    • 2021-06-04
    • 1970-01-01
    • 1970-01-01
    • 2013-05-26
    相关资源
    最近更新 更多