python - 将负行值与前一行 pandas 相加
问题描述
我很难找到一种好方法来查找列中的所有负条目并将它们向上移动,将它们与现有条目相加(即从当前条目中减去负条目),直到所有值都是正数。
重要的是最终数据帧没有负值,并且所有先前的负条目 = 0。此外,该表是重复的,这意味着我需要根据 ID 和条目聚合结果(仅对相同 ID 的条目进行求和)。
基于此处已提供的表格:
展示:
ID | 日期 | 参赛作品 |
---|---|---|
1 | 2013 | 100 |
1 | 2014 | 0 |
1 | 2015 | 60 |
1 | 2016 年 | -30 |
1 | 2017 | 0 |
1 | 2018 | 50 |
1 | 2019 | 0 |
1 | 2020 | -20 |
2 | 2013 | 100 |
2 | 2014 | 0 |
2 | 2015 | 60 |
2 | 2016 年 | -30 |
2 | 2017 | 0 |
2 | 2018 | 50 |
2 | 2019 | 0 |
2 | 2020 | -20 |
期望:
ID | 日期 | 参赛作品 |
---|---|---|
1 | 2013 | 100 |
1 | 2014 | 0 |
1 | 2015 | 30 |
1 | 2016 年 | 0 |
1 | 2017 | 0 |
1 | 2018 | 30 |
1 | 2019 | 0 |
1 | 2020 | 0 |
2 | 2013 | 100 |
2 | 2014 | 0 |
2 | 2015 | 30 |
2 | 2016 年 | 0 |
2 | 2017 | 0 |
2 | 2018 | 30 |
2 | 2019 | 0 |
2 | 2020 | 0 |
解决方案
您可以在创建组后尝试反向 cumsum,然后屏蔽:
s = df['Entries'].gt(0).cumsum()
u= df['Entries'][::-1].groupby(s).cumsum().mask(df['Entries'].le(0),0)
out = df.assign(New_Entries=u) # you can assign to the original column too.
print(out)
ID Date Entries New_Entries
0 1 2013 100 100
1 1 2014 0 0
2 1 2015 60 30
3 1 2016 -30 0
4 1 2017 0 0
5 1 2018 50 30
6 1 2019 0 0
7 1 2020 -20 0
8 2 2013 100 100
9 2 2014 0 0
10 2 2015 60 30
11 2 2016 -30 0
12 2 2017 0 0
13 2 2018 50 30
14 2 2019 0 0
15 2 2020 -20 0
推荐阅读
- python - Apply function is not working on a data-frame column
- node.js - Mongoose:如何为多种类型的查询运行 collection.find(),其中一种包括关键字搜索?
- sql - 具有由外键引用的另一个表的值的 PostgreSQL 计算列
- windows - 如何循环 For 命令以安装 Windows 10 可选功能 powershell
- r - 如何将这种类型的数据框转换为矩阵?
- optimization - 在fortran中访问虚拟变量会阻止优化?
- python - 我正在计算我的产品功能的余弦相似度,但想保存输出以便我不重新计算它
- flutter - 如何声明一个字节列表?
- encryption - 如何使用 Chef 编辑加密数据包?
- bash - awk 没有在 csv 的最后一列中进行替换