如何用Pandas高效实现从初始总额减至0的Balance列序列减法计算
高效计算Balance列的Pandas方案
直接上干货,用Pandas的向量化操作替代apply,性能拉满还不容易出错:
核心逻辑
每一行的Balance其实等于首行已知余额减去当前行及之前所有AMOUNT(从第二行开始)的总和,用cumsum()就能快速算出累计扣除额,再做减法就行。最后处理余额归零的边界情况——一旦余额降到0或以下,后面所有行都保持0。
分步实现
提取首行的初始余额
first_balance = df['Balance'].iloc[0]计算从第二行开始的累计扣除额
cumulative_amt = df['AMOUNT'].iloc[1:].cumsum()生成后续行的余额
df['Balance'].iloc[1:] = first_balance - cumulative_amt处理余额归零逻辑
找到第一个余额≤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
相关产品推荐
相关产品推荐

