You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 22:12:33