首页 > 解决方案 > Pandas DF 上的 Cumsum 对于负累积值重置为零

问题描述

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

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

Pandas 数据框 - 运行总和并重置

下面是代码(带有我一直在使用的示例数据):

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' 是我理想中想要实现的目标。] 感谢任何有更好想法和建议的人提供的任何帮助和建议来解决这个问题:-)

干杯,

纳德

标签: pythonpandaspandas-groupbycumsum

解决方案


我们试试看:

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

推荐阅读