python - Pandas DF 上的 Cumsum 对于负累积值重置为零
问题描述
我在 Pandas DF 中有一个时间顺序分组表。我正在尝试在组内创建一个运行总和,条件是运行总和不能为负数,即当运行总和变为负数时列单元格值重置为零,并继续运行总和计算以保持完整性和数据质量。
我已经将 cumsum() 与 groupby() 函数一起使用,但似乎无法即时将累积值重置为零。我还研究了下面的线程,但这与稍微不同的问题有关:
下面是代码(带有我一直在使用的示例数据):
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' 是我理想中想要实现的目标。] 感谢任何有更好想法和建议的人提供的任何帮助和建议来解决这个问题:-)
干杯,
纳德
解决方案
我们试试看:
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
推荐阅读
- php - 如何获取用`Imagick::commentImage()`写的评论
- android - 为什么 Sqlite db 不在 /data/data/{package name}/databases 而是在 /data/user/0?
- spring - Spring Data MongoDB中MappingMongodbConverter有什么用?
- firebase - 每个用户每秒的 Firebase 速率限制?
- sql - 设置变量显示不同的结果 SQL
- laravel - 具有默认值的 Laravel old() 输入数组?
- azure - 无论如何在 Azure IoT 中心的消息中标记或存储其他信息?
- ruby-on-rails - 如何在每个循环中订购变量?
- json -
使用 Vue.js 和 Vue Router 的 JSON 问题 - android - 检测到登录时如何更新所有 WebView 选项卡?