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
我正在尝试找出可以在 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