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

如何基于Pandas DataFrame列值创建递推百分比计算的新列?

解决基于前一行值生成新列的问题

原始数据与需求

原始DataFrame

import pandas as pd
df = pd.DataFrame({'a': [10, 20, 50]})

期望输出

a    b
0  10  100
1  20   20
2  50   10

生成规则

  • 初始值为1000
  • 列b的计算逻辑:
    • 第一行:1000 * (a列第一行值 / 100)
    • 后续每行:前一行b值 * (当前行a列值 / 100)

原代码问题分析

你提供的代码无法运行的原因是:在给第一行b赋值后,直接用整列赋值语句df['b'] = (df.a / 100) * df.b.shift(1)覆盖了整个b列。此时df.b.shift(1)的第一行是NaN,导致整列计算结果全为NaN,覆盖了之前设置的第一行值。

正确实现方法

方法1:使用累积乘积(高效简洁)

利用cumprod()计算累积乘积,直接得到每一行的结果,适合这种连续乘法的场景:

import pandas as pd

df = pd.DataFrame({'a': [10, 20, 50]})
initial_value = 1000

# 计算每行的乘数,再求累积乘积后乘以初始值
df['b'] = initial_value * (df['a'] / 100).cumprod()

方法2:逐行循环计算(直观易懂)

如果需要更灵活的逻辑(比如后续有复杂条件),可以用循环逐行计算:

import pandas as pd

df = pd.DataFrame({'a': [10, 20, 50]})
initial_value = 1000

# 初始化b列
df['b'] = 0.0
# 设置第一行b的值
df.loc[0, 'b'] = initial_value * (df['a'].iloc[0] / 100)
# 从第二行开始逐行计算
for i in range(1, len(df)):
    df.loc[i, 'b'] = df.loc[i-1, 'b'] * (df['a'].iloc[i] / 100)

两种方法运行后都能得到你期望的输出结果。

内容的提问来源于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 21:10:23