Pandas:如何用cumsum实现带范围约束的累计差值计算
问题:计算带取值范围约束的累计差值列C
现有如下Pandas DataFrame:
A B 5 0 5 10 5 0 5 0 5 50
需要计算列C,规则为:
- C是B与A的累计差值(每一步计算为上一步的C值加上当前行的
B - A) - C的取值必须限制在0到15之间(不能小于0,也不能大于15)
如何实现并得到如下目标结果?
A B C 5 0 0 5 10 5 5 0 0 5 0 0 5 50 15
解决方案
原生cumsum仅做纯累加,无法直接处理边界约束,但可以结合边界截断函数,通过自定义逻辑实现需求:
方法1:循环实现(小数据量友好)
import pandas as pd import numpy as np # 构造原始数据 df = pd.DataFrame({'A': [5,5,5,5,5], 'B': [0,10,0,0,50]}) # 计算每行的增量值 delta = df['B'] - df['A'] # 初始化C列,第一行先做截断 c_vals = [np.clip(delta.iloc[0], 0, 15)] # 逐行计算带约束的累计值 for i in range(1, len(df)): temp = c_vals[-1] + delta.iloc[i] c_vals.append(np.clip(temp, 0, 15)) # 将结果赋值给C列 df['C'] = c_vals print(df)
方法2:自定义累加函数(大数据量可选)
用expanding.apply或自定义遍历函数,避免显式循环的写法:
import pandas as pd import numpy as np df = pd.DataFrame({'A': [5,5,5,5,5], 'B': [0,10,0,0,50]}) def constrained_cumsum(increments): current = 0 result = [] for inc in increments: current += inc # 应用边界约束 current = max(0, min(current, 15)) result.append(current) return result df['C'] = constrained_cumsum(df['B'] - df['A'])
两种方法都能得到符合要求的C列结果。
内容的提问来源于stack exchange,提问作者RomB
相关产品推荐
相关产品推荐

