![](/img/trans.png)
[英]Pandas: Apply function that references other rows & other dataframe
[英]Apply function to pandas dataframe row using values in other rows
我有一种情况,我有一个数据帧行来执行计算,我需要使用以下(可能在前)行中的值来进行这些计算(基本上是基于实际数据集的完美预测)。 我从早期的df.apply
调用得到每一行,所以我可以将整个df传递给下游对象,但是根据我分析中对象的复杂性,这似乎不太理想。
我找到了一个密切相关的问题和答案[1],但问题实际上是根本不同的,因为我不需要整个df用于我的计算,只需要以下x
行(这对于大型dfs可能很重要)。
所以,例如:
df = pd.DataFrame([100, 200, 300, 400, 500, 600, 700, 800, 900, 1000],
columns=['PRICE'])
horizon = 3
我需要在行方式df.apply
调用中访问以下3( horizon
)行中的值。 如何在我的行式应用计算中动态地预测接下来的3个数据点? 例如,对于第一行的行, PRICE
为100
,我需要在我的计算中使用[200, 300, 400]
作为预测。
通过使用row.name
[1] df.apply
调用中的行索引,您可以生成相对于当前所在行的“预测”数据。 这实际上是将“预测”放到相关行上的预处理步骤,或者如果df在下游可用,它可以作为初始df.apply
调用的一部分完成。
df = pd.DataFrame([100, 200, 300, 400, 500, 600, 700, 800, 900, 1000], columns=['PRICE'])
horizon = 3
df['FORECAST'] = df.apply(lambda x: [df['PRICE'][x.name+1:x.name+horizon+1]], axis=1)
结果如下:
PRICE FORECAST
0 100 [200, 300, 400]
1 200 [300, 400, 500]
2 300 [400, 500, 600]
3 400 [500, 600, 700]
4 500 [600, 700, 800]
5 600 [700, 800, 900]
6 700 [800, 900, 1000]
7 800 [900, 1000]
8 900 [1000]
9 1000 []
哪个可用于行式df.apply
计算。
编辑:如果要从生成的“预测”中删除索引:
df['FORECAST'] = df.apply(lambda x: [df['PRICE'][x.name+1:x.name+horizon+1].reset_index(drop=True)], axis=1)
您可能会发现这也很有用。
keys = range(horizon + 1)
pd.concat([df.shift(-i) for i in keys], axis=1, keys=keys)
0 1 2 3
PRICE PRICE PRICE PRICE
0 100 200.0 300.0 400.0
1 200 300.0 400.0 500.0
2 300 400.0 500.0 600.0
3 400 500.0 600.0 700.0
4 500 600.0 700.0 800.0
5 600 700.0 800.0 900.0
6 700 800.0 900.0 1000.0
7 800 900.0 1000.0 NaN
8 900 1000.0 NaN NaN
9 1000 NaN NaN NaN
如果你将concat
分配给df_c
keys = range(horizon + 1)
df_c = pd.concat([df.shift(-i) for i in keys], axis=1, keys=keys)
df_c.apply(lambda x: pd.Series([x[0].values, x[1:].values]), axis=1)
0 1
0 [100.0] [200.0, 300.0, 400.0]
1 [200.0] [300.0, 400.0, 500.0]
2 [300.0] [400.0, 500.0, 600.0]
3 [400.0] [500.0, 600.0, 700.0]
4 [500.0] [600.0, 700.0, 800.0]
5 [600.0] [700.0, 800.0, 900.0]
6 [700.0] [800.0, 900.0, 1000.0]
7 [800.0] [900.0, 1000.0, nan]
8 [900.0] [1000.0, nan, nan]
9 [1000.0] [nan, nan, nan]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.