Pandas实现cumsum累计求和正值保留否则置零的方法
非负累计余额计算实现方法
你需要先逐行计算收支净额,再按每一步累计结果非负的规则迭代计算Total列,不能直接对错误的累计结果做裁剪,也不需要用apply逐行操作(效率低且逻辑容易写错)。
实现代码
import pandas as pd # 构造示例数据 df = pd.DataFrame({ 'Incoming': [0, 10, 100, 50], 'Outgoing': [150, 20, 30, 70] }) # 计算单期收支净额 df['net'] = df['Incoming'] - df['Outgoing'] # 自定义非负累计函数 def calc_non_neg_cumulative(net_series): current_balance = 0 total_list = [] for net_val in net_series: current_balance += net_val current_balance = max(current_balance, 0) total_list.append(current_balance) return total_list # 生成目标Total列 df['Total'] = calc_non_neg_cumulative(df['net'])
运行后输出的df的Total列和你期望的结果完全一致:[0, 0, 70, 50]
原有方法错误原因
df.clip(lower=0)仅能对已有的值做下限裁剪,你原来的Total列本身累计逻辑错误,直接裁剪后还是不符合要求。- 你写的apply方法存在多处错误:lambda内直接引用整列而非单行值、收支相减顺序写反、没有实现累计逻辑、缺少else分支语法不完整,因此无法得到正确结果。
内容的提问来源于stack exchange,提问作者Kavi Harjani
相关产品推荐
相关产品推荐

