Excel、Oracle、Spotfire、Python求逐行累加的方法

如果有每人每天的金额数据,要得到每人逐行累计金额一列,即每天的金额=当天之前所有金额之和,并按姓名分组计算,如下表所示,该如何实现呢?

姓名日期金额累计金额
张三2022030111
张三2022030223
张三2022030325
张三2022030416
李四2022030222
李四2022030335
李四2022030427
李四2022030518
王五2022030122
王五2022030213
王五2022030347
王五2022030429
1. Excel中实现方式

假设上述姓名、日期、金额在Excel的A、B、C列,从第一行开始,在D2单元格中输入公式:

=IF(A2=A1,C2+D1,C2)

然后下拉至最后一行即可,公式效果如下:

姓名日期金额累计金额
张三202203011=IF(A2=A1,C2+D1,C2)
张三202203022=IF(A3=A2,C3+D2,C3)
张三202203032=IF(A4=A3,C4+D3,C4)
张三202203041=IF(A5=A4,C5+D4,C5)
李四202203022=IF(A6=A5,C6+D5,C6)
李四202203033=IF(A7=A6,C7+D6,C7)
李四202203042=IF(A8=A7,C8+D7,C8)
李四202203051=IF(A9=A8,C9+D8,C9)
王五202203012=IF(A10=A9,C10+D9,C10)
王五202203021=IF(A11=A10,C11+D10,C11)
王五202203034=IF(A12=A11,C12+D11,C12)
王五202203042=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


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部