如何基于Pandas DataFrame两列值迭代生成新列c?
生成依赖上一行结果的Pandas列c
现有如下Pandas DataFrame:
import pandas as pd df = pd.DataFrame({'a': [10, 20, 50], 'b': [5, 2, 20]})
需要生成目标输出:
a b c 0 10 5 1005 1 20 2 1009.02 2 50 20 1109.922
列c的生成规则:
- 初始值为1000
- 每行
c的计算依赖上一行的c值,具体逻辑:
对于第n行(n≥0),设上一行的c值为prev_c:x = prev_c * (df['a'].iloc[n] / 100) y = 1 + (df['b'].iloc[n] / 100) z = prev_c - x current_c = (x * y) + z
你尝试的代码未成功:
df['c'] = ((df.a / 100 * (1 + df.b / 100)).cumprod() * 1000) + 1000
错误原因分析
你之前的公式推导有误,先对计算逻辑做化简:
将x、y、z代入current_c的表达式:
current_c = (prev_c*(a/100)*(1 + b/100)) + (prev_c - prev_c*(a/100))
提取公因子prev_c后化简:
current_c = prev_c * [ (a/100)(1 + b/100) + 1 - a/100 ] = prev_c * [ 1 + (a*b)/(10000) ]
可见每一行的c是前一行值乘以1 + (a*b)/10000,而不是你之前的公式逻辑。
正确实现方法
方法1:利用cumprod高效计算(推荐)
基于化简后的公式,先计算每行的乘数,再用累积乘积结合初始值生成c列:
# 计算每行的乘数 multipliers = 1 + (df['a'] * df['b']) / 10000 # 计算累积乘积,乘以初始值1000得到c列 df['c'] = 1000 * multipliers.cumprod() # 可选:保留指定小数位数 df['c'] = df['c'].round(3)
执行后得到的结果与目标输出一致:
a b c 0 10 5 1005.000 1 20 2 1009.020 2 50 20 1109.922
方法2:循环逐行计算(适合理解逻辑,小数据集适用)
如果想更直观地体现依赖逻辑,可以用循环逐行计算:
initial_c = 1000 df['c'] = 0.0 df.loc[0, 'c'] = initial_c * (1 + (df['a'].iloc[0] * df['b'].iloc[0])/10000) for i in range(1, len(df)): prev_c = df['c'].iloc[i-1] df.loc[i, 'c'] = prev_c * (1 + (df['a'].iloc[i] * df['b'].iloc[i])/10000) df['c'] = df['c'].round(3)
这种方法逻辑清晰,但对于大型数据集,效率不如cumprod方法。
内容的提问来源于stack exchange,提问作者AmirX
相关产品推荐
相关产品推荐

