Excel、Oracle、Spotfire、Python求逐行累加的方法
如果有每人每天的金额数据,要得到每人逐行累计金额一列,即每天的金额=当天之前所有金额之和,并按姓名分组计算,如下表所示,该如何实现呢?
| 姓名 | 日期 | 金额 | 累计金额 |
|---|---|---|---|
| 张三 | 20220301 | 1 | 1 |
| 张三 | 20220302 | 2 | 3 |
| 张三 | 20220303 | 2 | 5 |
| 张三 | 20220304 | 1 | 6 |
| 李四 | 20220302 | 2 | 2 |
| 李四 | 20220303 | 3 | 5 |
| 李四 | 20220304 | 2 | 7 |
| 李四 | 20220305 | 1 | 8 |
| 王五 | 20220301 | 2 | 2 |
| 王五 | 20220302 | 1 | 3 |
| 王五 | 20220303 | 4 | 7 |
| 王五 | 20220304 | 2 | 9 |
1. Excel中实现方式
假设上述姓名、日期、金额在Excel的A、B、C列,从第一行开始,在D2单元格中输入公式:
=IF(A2=A1,C2+D1,C2)
然后下拉至最后一行即可,公式效果如下:
| 姓名 | 日期 | 金额 | 累计金额 |
| 张三 | 20220301 | 1 | =IF(A2=A1,C2+D1,C2) |
| 张三 | 20220302 | 2 | =IF(A3=A2,C3+D2,C3) |
| 张三 | 20220303 | 2 | =IF(A4=A3,C4+D3,C4) |
| 张三 | 20220304 | 1 | =IF(A5=A4,C5+D4,C5) |
| 李四 | 20220302 | 2 | =IF(A6=A5,C6+D5,C6) |
| 李四 | 20220303 | 3 | =IF(A7=A6,C7+D6,C7) |
| 李四 | 20220304 | 2 | =IF(A8=A7,C8+D7,C8) |
| 李四 | 20220305 | 1 | =IF(A9=A8,C9+D8,C9) |
| 王五 | 20220301 | 2 | =IF(A10=A9,C10+D9,C10) |
| 王五 | 20220302 | 1 | =IF(A11=A10,C11+D10,C11) |
| 王五 | 20220303 | 4 | =IF(A12=A11,C12+D11,C12) |
| 王五 | 20220304 | 2 | =IF(A13=A12,C13+D12,C13) |
2. 数据库(Oracle)中实现方式
由于数据库中无法像Excel一样进行行操作,因此不能用类似Excel的公式,直接用窗口函数聚合即可
SELECT "姓名","日期","金额",
SUM("金额") OVER (PARTITION BY "姓名" ORDER BY "日期") AS "累计金额"
FROM THE_TABLE
3. Spotfire中实现方式
①可以在原表中增加一列计算列,原理和数据库类似:
Sum([金额]) over (Intersect([姓名],AllPrevious([日期])))
②在可视化视图中也可直接实现:

上图Y轴中“累计”的公式为:
Sum([金额]) over (Intersect(Parent([Axis.X]),AllPrevious([Axis.X]))) as 累计
4. Python中实现方式
可以直接使用Dataframe中的cumsum(函数),需注意如果原表数据的顺序不符合累加需求,需要先对数据进行排序
data = pd.read_csv('test.csv',encoding='gbk')
data.sort_values(by=['姓名','日期'],ascending=[True,True],inplace=True) #如果数据的顺序本来就是符合要求的,可以不用排序
data['累计金额'] = data.groupby('姓名')['金额'].cumsum()
data
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
