使用其他行中的值将函数应用于pandas数据框行

2024-05-16 06:24:56 发布

您现在位置:Python中文网/ 问答频道 /正文

在这种情况下,我有一个dataframe行来执行计算,我需要使用后面(可能是前面)行中的值来执行这些计算(基本上是基于真实数据集的完美预测)。我从前面的一个df.apply调用中获取每一行,这样我就可以将整个df传递给下游对象,但基于分析中对象的复杂性,这似乎不太理想。

我发现了一个密切相关的问题和答案[1],但问题实际上是根本不同的,因为我的计算不需要整个df,只需要下面的x行数(对于大型df可能很重要)。

例如:

df = pd.DataFrame([100, 200, 300, 400, 500, 600, 700, 800, 900, 1000], 
                  columns=['PRICE'])
horizon = 3

我需要在我的按行df.apply调用中访问以下3(horizon)行中的值。如何在我的行级应用计算中动态地获得接下来3个数据点的朴素预测?e、 g.对于第一行,其中PRICE100,我需要在计算中使用[200, 300, 400]作为预测。

[1]apply a function to a pandas Dataframe whose returned value is based on other rows


Tags: columns数据对象答案dataframedf情况price
2条回答

通过使用row.name[1]在df.apply调用中获取行的索引,可以生成与当前所在行相关的“forecast”数据。这实际上是一个将“forecast”放到相关行的预处理步骤,或者如果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                []

它可以在您的行级计算中使用。

编辑: 如果要从结果“Forecast”中删除索引:

df['FORECAST'] = df.apply(lambda x: [df['PRICE'][x.name+1:x.name+horizon+1].reset_index(drop=True)], axis=1)

[1]getting the index of a row in a pandas apply function

你可能会发现这也很有用。

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]

相关问题 更多 >