You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Pandas高效实现从初始总额减至0的Balance列序列减法计算

高效计算Balance列的Pandas方案

直接上干货,用Pandas的向量化操作替代apply,性能拉满还不容易出错:

核心逻辑

每一行的Balance其实等于首行已知余额减去当前行及之前所有AMOUNT(从第二行开始)的总和,用cumsum()就能快速算出累计扣除额,再做减法就行。最后处理余额归零的边界情况——一旦余额降到0或以下,后面所有行都保持0。

分步实现

  1. 提取首行的初始余额

    first_balance = df['Balance'].iloc[0]
    
  2. 计算从第二行开始的累计扣除额

    cumulative_amt = df['AMOUNT'].iloc[1:].cumsum()
    
  3. 生成后续行的余额

    df['Balance'].iloc[1:] = first_balance - cumulative_amt
    
  4. 处理余额归零逻辑
    找到第一个余额≤0的位置,把它及后面的行都设为0:

    if (df['Balance'] <= 0).any():
        zero_idx = df[df['Balance'] <= 0].index[0]
        df.loc[zero_idx:, 'Balance'] = 0
    

完整代码示例

import pandas as pd

# 模拟输入数据
df = pd.DataFrame({
    'Index': [1, 2, 3, 4, 5],
    'AMOUNT': [18661.02, 20000, 30000, 50000, 40000],
    'Balance': [135214.99, None, None, None, None]
})

# 执行余额计算
first_balance = df['Balance'].iloc[0]
df['Balance'].iloc[1:] = first_balance - df['AMOUNT'].iloc[1:].cumsum()

# 处理余额归零
if (df['Balance'] <= 0).any():
    zero_idx = df[df['Balance'] <= 0].index[0]
    df.loc[zero_idx:, 'Balance'] = 0

print(df)

为啥这方案更好?

  • 性能碾压apply:cumsum()是Pandas底层C实现的向量化操作,不像apply那样逐行跑Python函数,大数据量下差距特别明显。
  • 代码简洁直观,减少自定义函数的维护成本,也不容易写出逻辑bug。

内容的提问来源于stack exchange,提问作者Aditya Karnik

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 07:47:18