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和预期结果完全一致:
| Date | Price | Proxy | Div | Days |
|---|---|---|---|---|
| 2021-01-13 | 10.00 | 20 | 0.5 | NaN |
| 2021-01-08 | 2.22 | 30 | 0.6 | 5.0 |
| 2021-01-04 | 0.60 | 40 | 0.7 | 4.0 |
| 2021-01-03 | 0.60 | 50 | 0.8 | 1.0 |
| 2021-01-01 | 0.28 | 60 | 0.9 | 2.0 |
内容的提问来源于stack exchange,提问作者Lopez
相关产品推荐
相关产品推荐

