大熊猫数据框从前一年的同月获得滞后值

问题描述 投票:1回答:1

我有一个以下数据帧:

           Id         Year             Month  Amount
0         1845        2010.0            1.0  18480.0
1         1845        2010.0            2.0  19560.0
2         1845        2010.0            3.0  23160.0
3         1845        2010.0            4.0  26360.0
4         1845        2010.0            5.0  31560.0
5         1845        2010.0            6.0  36080.0
6         1845        2010.0            7.0  35440.0
7         1845        2010.0            8.0  32960.0
8         1845        2010.0            9.0  33560.0
9         1845        2010.0           10.0  24240.0
10        1845        2010.0           11.0  24080.0
11        1845        2010.0           12.0  19680.0
12        1845        2011.0            1.0  18400.0
13        1845        2011.0            2.0  17960.0
14        1845        2011.0            3.0  20200.0
15        1845        2011.0            4.0  25560.0
16        1845        2011.0            5.0  29240.0
17        1845        2011.0            6.0  29160.0
18        1845        2011.0            7.0  29480.0
19        1845        2011.0            8.0  31000.0
20        1845        2011.0            9.0  25920.0
21        1845        2011.0           10.0  22560.0
22        1845        2011.0           11.0  25120.0
23        1845        2011.0           12.0  19640.0
24        1845        2012.0            1.0  20800.0
25        1845        2012.0            2.0  18880.0
26        1845        2012.0            3.0  21960.0
27        1845        2012.0            4.0  26920.0
28        1845        2012.0            5.0  28280.0
29        1845        2012.0            6.0  29160.0
30        1845        2012.0            7.0  32520.0
31        1845        2012.0            8.0  29720.0
32        1845        2012.0            9.0  28880.0
33        1845        2012.0           10.0  23760.0
34        1845        2012.0           11.0  22040.0
35        1845        2012.0           12.0  21960.0

对于每个id,我想要去年同一个月,并获得Amount列的最后2个值的平均值。例如,对于id = 1845,2011年和6月,我想要金额值的平均值为05/2010和04/2010。我怎样才能做到这一点?我的实际数据框非常庞大,每个id都有大约3年的ID和历史数据。

python-3.x pandas dataframe
1个回答
1
投票
  1. 支持'Year'在索引中。
  2. 跟进shift落后一年。
  3. 然后stackshift并使用rolling(2).mean()

d = df.pivot_table('Amount', 'Year', ['Id', 'Month'])
d.shift().stack().shift().rolling(2).mean().stack().rename('Amount').reset_index()

      Year  Month    Id   Amount
0   2011.0    3.0  1845  19020.0
1   2011.0    4.0  1845  21360.0
2   2011.0    5.0  1845  24760.0
3   2011.0    6.0  1845  28960.0
4   2011.0    7.0  1845  33820.0
5   2011.0    8.0  1845  35760.0
6   2011.0    9.0  1845  34200.0
7   2011.0   10.0  1845  33260.0
8   2011.0   11.0  1845  28900.0
9   2011.0   12.0  1845  24160.0
10  2012.0    1.0  1845  21880.0
11  2012.0    2.0  1845  19040.0
12  2012.0    3.0  1845  18180.0
13  2012.0    4.0  1845  19080.0
14  2012.0    5.0  1845  22880.0
15  2012.0    6.0  1845  27400.0
16  2012.0    7.0  1845  29200.0
17  2012.0    8.0  1845  29320.0
18  2012.0    9.0  1845  30240.0
19  2012.0   10.0  1845  28460.0
20  2012.0   11.0  1845  24240.0
21  2012.0   12.0  1845  23840.0
© www.soinside.com 2019 - 2024. All rights reserved.