我有这张输入表,总额是153876.01

Index AMOUNT Balance
0 18661.02 135214.99
2 1365.44
3 2821.91
4 2821.91
... ...
75 227.57
76 188.13
77 141.10
78 84.96
79 47.08

我需要计算Balance,如下所示:

Imports Balance
0 18661.02 135214.99
1 1365.44 133849.55
2 2821.91 131027.64
3 2821.91 128205.73
4 2548.82 125656.91
.. ... ...
73 227.57 461.27
74 188.13 273.14
75 141.10 132.04
76 84.96 47.08
77 47.08 0.00

[78行x 2列]

更好的解释应该是:

这就是我现在正在做的,并且能够计算Balance列:

def somefunc(row):
    print(row.name)
    if row.name != 0:
        print(row.name, df_in['Balance'][row.name-1], row['AMOUNT'])
        df_in.at[row.name, 'Balance'] = df_in['Balance'][row.name-1] - row['AMOUNT']
df_in.apply(somefunc, axis=1)

我正在寻找一个正确的解决方案,它比这个好得多,而且在使用Pandas 的时候也是正确的.

推荐答案

计算cumsumrsub你的初始总分:

total = 153876.01
# or if the final Balance should be 0
total = df['AMOUNT'].sum()

df['Balance'] = df['AMOUNT'].cumsum().rsub(total)

如果最终余额为0,您还可以计算出cumsumshift的倒数,这可能会更高效地计算:

df['Balance'] = df.loc[::-1, 'AMOUNT'].cumsum().shift(fill_value=0)

输出:

      AMOUNT    Balance
 0  18661.02  135214.99
 1   1365.44  133849.55
 2   2821.91  131027.64
...
77     47.08       0.00

Python相关问答推荐

如何在BeautifulSoup中链接Find()方法并处理无?

acme错误-Veritas错误:模块收件箱没有属性linear_util'

SQLGory-file包FilField不允许提供自定义文件名,自动将文件保存为未命名

我如何使法国在 map 中完全透明的代码?

Stacked bar chart from billrame

所有列的滚动标准差,忽略NaN

使用NeuralProphet绘制置信区间时出错

如何在UserSerializer中添加显式字段?

当点击tkinter菜单而不是菜单选项时,如何执行命令?

如何使用Pandas DataFrame按日期和项目汇总计数作为列标题

实现神经网络代码时的TypeError

UNIQUE约束失败:customuser. username

在Python中调用变量(特别是Tkinter)

基于另一列的GROUP-BY聚合将列添加到Polars LazyFrame

Python日志(log)模块如何在将消息发送到父日志(log)记录器之前向消息添加类实例变量

使用tqdm的进度条

Python类型提示:对于一个可以迭代的变量,我应该使用什么?

合并相似列表

设置索引值每隔17行左右更改的索引

将数字数组添加到Pandas DataFrame的单元格依赖于初始化