我有以下数据框:
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,每个ID大约有3年的历史数据。
答案 0 :(得分:1)
'Year'
在索引中。shift
以落后一年。stack
,shift
并使用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