如何在Pandas DataFrame中递推计算Stawka E列的后续值
递推计算Stawka E列的解决方案
问题需求
需按以下规则递推计算Stawka E列的值:
- 2024年
Stawka E= 2023年Stawka E× 2023年CPI/100 - 2025年
Stawka E= 2024年Stawka E× 2024年CPI/100 - 以此类推
原始代码问题
你之前的代码通过np.where和apply尝试计算,但无法实现递推逻辑——向量式运算不会逐行更新Stawka E的值,shift(1)始终取初始的2023年值,而非上一行计算后的结果。原始代码如下:
import numpy as np import pandas as pd st_opl_prze_dict ={ "Rok" : [2023,2024,2025,2026,2027], "Stawka E" : [2.275, np.NaN, np.NaN, np.NaN, np.NaN], "Stawka Ln" : [2.275, np.NaN, np.NaN, np.NaN, np.NaN], "CPI" : [11.9, 5.2, 3.6, 3, 2 ] } st_opl_prze = pd.DataFrame(st_opl_prze_dict) st_opl_prze["Stawka E"] = np.where(st_opl_prze["Stawka E"].isnull(), st_opl_prze["Stawka E"].apply(lambda x: st_opl_prze["Stawka E"].shift(1) * st_opl_prze["CPI"] / 100), st_opl_prze["Stawka E"])
解决方案
提供两种可行的实现方式:
方法1:循环迭代(直观易懂)
通过逐行遍历,用上一行的计算结果更新当前行,完美匹配递推逻辑:
import numpy as np import pandas as pd st_opl_prze_dict ={ "Rok" : [2023,2024,2025,2026,2027], "Stawka E" : [2.275, np.NaN, np.NaN, np.NaN, np.NaN], "Stawka Ln" : [2.275, np.NaN, np.NaN, np.NaN, np.NaN], "CPI" : [11.9, 5.2, 3.6, 3, 2 ] } st_opl_prze = pd.DataFrame(st_opl_prze_dict) # 从第2行(索引1)开始递推计算 for i in range(1, len(st_opl_prze)): st_opl_prze.loc[i, 'Stawka E'] = st_opl_prze.loc[i-1, 'Stawka E'] * st_opl_prze.loc[i-1, 'CPI'] / 100 print(st_opl_prze)
方法2:累积乘积(高效向量运算)
利用cumprod()计算CPI的累积乘积,结合初始值一次性生成结果,适合大数据量场景:
import numpy as np import pandas as pd st_opl_prze_dict ={ "Rok" : [2023,2024,2025,2026,2027], "Stawka E" : [2.275, np.NaN, np.NaN, np.NaN, np.NaN], "Stawka Ln" : [2.275, np.NaN, np.NaN, np.NaN, np.NaN], "CPI" : [11.9, 5.2, 3.6, 3, 2 ] } st_opl_prze = pd.DataFrame(st_opl_prze_dict) # 填充初始值,计算上一年CPI的累积乘积并应用 st_opl_prze['Stawka E'] = st_opl_prze['Stawka E'].ffill() * (1 + st_opl_prze['CPI'].shift(1)/100).cumprod().fillna(1) print(st_opl_prze)
结果验证
两种方法都会得到如下正确结果(保留三位小数):
| Rok | Stawka E | Stawka Ln | CPI |
|---|---|---|---|
| 2023 | 2.275 | 2.275 | 11.9 |
| 2024 | 2.546 | 2.275 | 5.2 |
| 2025 | 2.678 | 2.275 | 3.6 |
| 2026 | 2.758 | 2.275 | 3.0 |
| 2027 | 2.813 | 2.275 | 2.0 |
内容的提问来源于stack exchange,提问作者Adii
相关产品推荐
相关产品推荐

