如何在Pandas中利用列历史值计算依赖前值的新列
在Pandas中实现依赖历史值的Calculated Value计算
问题背景
给定如下Pandas DataFrame:
import pandas as pd df = pd.DataFrame({ 'Particulars': {0: 'Add', 1: 'Subs', 2: 'Add', 3: 'Subs', 4: 'Add', 5: 'Subs', 6: 'Add', 7: 'Subs'}, 'Addition': {0: 129, 1: 0, 2: 388, 3: 0, 4: 442, 5: 0, 6: 853, 7: 0}, 'Substraction': {0: 0, 1: 32, 2: 0, 3: 102, 4: 0, 5: 200, 6: 0, 7: 589}, 'Expected': {0: 129, 1: 0, 2: 388, 3: 0, 4: 406, 5: 0, 6: 0, 7: 0} })
需要生成Calculated Value列,计算逻辑:
- 总扣除量 = 所有
Substraction列值的总和(此处为923) - 每行计算值取以下二者的最小值:
- 当前行的
Addition值 - 总扣除量 - 截至当前行之前的
Calculated Value累计和
- 当前行的
Subs行的Addition为0,因此计算值直接为0
解决方案
由于计算依赖前序行的结果,无法直接使用矢量化操作,需逐行迭代处理:
import pandas as pd # 初始化DataFrame df = pd.DataFrame({ 'Particulars': {0: 'Add', 1: 'Subs', 2: 'Add', 3: 'Subs', 4: 'Add', 5: 'Subs', 6: 'Add', 7: 'Subs'}, 'Addition': {0: 129, 1: 0, 2: 388, 3: 0, 4: 442, 5: 0, 6: 853, 7: 0}, 'Substraction': {0: 0, 1: 32, 2: 0, 3: 102, 4: 0, 5: 200, 6: 0, 7: 589}, 'Expected': {0: 129, 1: 0, 2: 388, 3: 0, 4: 406, 5: 0, 6: 0, 7: 0} }) # 计算总扣除量 total_sub = df['Substraction'].sum() # 初始化计算列与累积和变量 df['Calculated Value'] = 0 cumulative_sum = 0 # 逐行处理 for idx, row in df.iterrows(): if row['Particulars'] == 'Add': # 计算剩余可用扣除额度 remaining_quota = total_sub - cumulative_sum # 取当前Addition和剩余额度的最小值 current_val = min(row['Addition'], remaining_quota) df.loc[idx, 'Calculated Value'] = current_val # 更新累积和 cumulative_sum += current_val # 验证结果 print(df[['Calculated Value', 'Expected']])
运行结果
输出结果与预期列完全匹配:
Calculated Value Expected 0 129 129 1 0 0 2 388 388 3 0 0 4 406 406 5 0 0 6 0 0 7 0 0
逻辑说明
- 先计算总扣除量,作为固定的额度上限
- 用
cumulative_sum跟踪已使用的扣除额度 - 对每个
Add行,计算剩余可用额度后取最小值,同时更新累积和 Subs行因Addition为0,计算值保持0,不影响累积和
内容的提问来源于stack exchange,提问作者mshah
相关产品推荐
相关产品推荐

