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

Pandas DataFrame无需循环填充Price空值的向量化实现方案

解决方法

你的需求属于递推除法运算,这类操作可以通过**累积乘积(cumprod)**实现完全向量化,不需要遍历行,实现逻辑如下:

核心思路

递推公式当前行Price = 上一行有效Price / 除数因子可以等价转换为:第N行Price = 初始Price / 前N-1个除数因子的乘积,所以只需要先计算出每一步的除数因子,再做累积乘积,最后用初始值除以累积乘积即可得到所有行的Price值。

实现代码

首先导入依赖库,再执行计算:

import pandas as pd
import numpy as np

# 初始数据生成
data = {'Date': ['2021-01-13', '2021-01-08', '2021-01-04', '2021-01-03', '2021-01-01'],
        'Price':[10, np.nan, np.nan, np.nan,np.nan],
        'Proxy':[20, 30, 40, 50, 60],
        'Div':[0.5, 0.6, 0.7, 0.8, 0.9],
        'Days':[np.nan, 5, 4, 1, 2]}
df = pd.DataFrame(data)

# 计算每一步的除数因子(对应当前行算下一行Price要用的除数)
df['factor'] = (df['Proxy'].shift(-1) / df['Proxy']) * df['Div'].shift(-1) * df['Days'].shift(-1)
# 将因子下移一行,第一行因子填充为1(初始值不用除任何数)
df['factor'] = df['factor'].shift(1).fillna(1)
# 计算累积乘积
df['cum_factor'] = df['factor'].cumprod()
# 计算Price并保留两位小数
df['Price'] = (df['Price'].iloc[0] / df['cum_factor']).round(2)
# 删掉辅助计算列
df = df.drop(columns=['factor', 'cum_factor'])

输出结果

运行后得到的df和预期结果完全一致:

DatePriceProxyDivDays
2021-01-1310.00200.5NaN
2021-01-082.22300.65.0
2021-01-040.60400.74.0
2021-01-030.60500.81.0
2021-01-010.28600.92.0

内容的提问来源于stack exchange,提问作者Lopez

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 12:54:04