Pandas无循环实现分组滚动计算滞后价格与(1+Factor)乘积填充空值
分组滚动乘积填充Price列的无循环实现方案
import pandas as pd import numpy as np # 初始数据构造 d = {'Group': [1,1,1,1], 'Year': [2023, 2024, 2025, 2026], 'Price': [17.324, np.NaN, np.NaN, np.NaN], 'Factor': [0.019, 0.021, 0.022, 0.022]} df = pd.DataFrame(data=d) # 核心计算逻辑 df['Price'] = df.groupby('Group', group_keys=False).apply( lambda x: x['Price'].iloc[0] * (1 + x['Factor'].shift(fill_value=0)).cumprod() )
方案逻辑说明
本方案用累积乘积算子cumprod替代自定义滚动函数,全程无显式循环,性能远高于逐行迭代:
- 每个分组取首个非空Price作为计算初始基数
- 对Factor列做位移处理,首行填充0,保证首年乘子为1,计算结果等于初始Price
- 对位移后的
1+Factor列做累积乘积,再乘初始基数即可直接得到所有年份的Price值
计算结果完全匹配预期:
| Group | Year | Price | Factor |
|---|---|---|---|
| 1 | 2023 | 17.324000 | 0.019 |
| 1 | 2024 | 17.653156 | 0.021 |
| 1 | 2025 | 18.023872 | 0.022 |
| 1 | 2026 | 18.420397 | 0.022 |
原有方案失效原因
- rolling思路不匹配需求:rolling是固定窗口的聚合计算,你需要的是贯穿全组的累积迭代计算,
cumprod才是适配的算子 - 自定义函数逻辑不完整:仅能计算出第二期的Price,没有将计算出的新值回填到Price列参与后续计算,第三期及以后的计算会因为拿到原始NaN值返回空结果
内容的提问来源于stack exchange,提问作者LBro
相关产品推荐
相关产品推荐

