Pandas DataFrame - 访问动态创建的值

Pandas DataFrame - Access Values That are created on the fly

我正在尝试找出可以在 excel 上轻松执行的操作,但我很难理解如何在不使用循环的情况下在 Pandas 数据帧上执行此操作。

假设我有一个数据框如下:

+------------+-------+-------+-----+------+
|    Date    | Price | Proxy | Div | Days |
+------------+-------+-------+-----+------+
| 13/01/2021 | 10    |    20 | 0.5 | NaN  |
| 08/01/2021 | NaN   |    30 | 0.6 | 5    |
| 04/01/2021 | NaN   |    40 | 0.7 | 4    |
| 03/01/2021 | NaN   |    50 | 0.8 | 1    |
| 01/01/2021 | NaN   |    60 | 0.9 | 2    |
+------------+-------+-------+-----+------+

任务是填充所有价格为空的价格。在 excel 中,我假设 Date 是第 A 列和 Date id 第 2 行的第一行,然后在 Price 的第 2 行中填充 NaN 我会使用公式 =(B2)/(((C3/C2)*D3)*E3)=2.22.

现在我想即时使用值 2.22 来填充 Price 的第 3 行中的 NaN 原因是要填充第 3 行的 nan 我需要使用填充的第 2 行值.因此 excel 中的公式将填充第 3 行的价格将是 =(B3)/(((C4/C3)*D4)*E4).

一种方法是遍历我不想做的数据框的所有行。解决这个问题的矢量化方法是什么?

预期输出

+------------+-------+-------+-----+------+
|    Date    | Price | Proxy | Div | Days |
+------------+-------+-------+-----+------+
| 13/01/2021 |    10 |    20 | 0.5 | NA   |
| 08/01/2021 |  2.22 |    30 | 0.6 | 5    |
| 04/01/2021 |  0.60 |    40 | 0.7 | 4    |
| 03/01/2021 |  0.60 |    50 | 0.8 | 1    |
| 01/01/2021 |  0.28 |    60 | 0.9 | 2    |
+------------+-------+-------+-----+------+

Current_Price = Prev Price (non-nan) / (((Current_Proxy/Prev_Proxy) * Div) * Days)

编辑

使用以下代码创建初始数据框

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)

你要实现的其实是一个累加积:

df['Price'] = (df['Price'].combine_first(df['Proxy'].shift()/df.eval('Proxy*Div*Days'))
               .cumprod().round(2))

输出:

         Date  Price  Proxy  Div  Days
0  2021-01-13  10.00     20  0.5   NaN
1  2021-01-08   2.22     30  0.6   5.0
2  2021-01-04   0.60     40  0.7   4.0
3  2021-01-03   0.60     50  0.8   1.0
4  2021-01-01   0.28     60  0.9   2.0