我有以下数据框。
My Sample Dataframe is as follows:
Area Num Month Year Type Result
AA 1 Jan 2015 A 1
AA 1 Feb 2015 A 2
AA 1 Mar 2015 A 3
AA 1 Apr 2015 A 4
AA 1 May 2015 A 5
AA 1 Jun 2015 A 6
AA 1 Jul 2015 A 7
AA 1 Aug 2015 A 8
AA 1 Sep 2015 A 9
AA 1 Oct 2015 A 10
AA 1 Nov 2015 A 11
AA 1 Dec 2015 A 12
BB 2 Jan 2015 B 1
BB 2 Feb 2015 B 2
BB 2 Mar 2015 B 3
BB 2 Apr 2015 B 4
BB 2 May 2015 B 5
BB 2 Jun 2015 B 6
BB 2 Jul 2015 B 7
BB 2 Aug 2015 B 8
BB 2 Sep 2015 B 9
BB 2 Oct 2015 B 10
BB 2 Nov 2015 B 11
BB 2 Dec 2015 B 12
我需要按列分组:面积,数量,类型,年份,并为每个组计算第90个百分位数。上面显示的数据框只是一个样本。我为每个“区域”都有多个“Num”和“Type”。
我的预期输出是:
我需要为此组中的每个人计算前12个月的12个月百分位值,并在下个月粘贴输出。
例如: 使用{Area:AA,Num:1,Year:2015,Type:A}计算组的第90个百分位值,并将其分配给{Area:AA,Num:1,Year:2016,Type:A,Month:Jan }。
Area Num Month Year Type Result
AA 1 Jan 2016 A 10.9
AA 1 Feb 2016 A 10.99
现在为新组(月份2月){面积:AA,Num:1,年份:2016年,类型:A,月份:2月}应该计算从2015年2月到2016年1月的第90个百分点结果列的值,所以上。 我正在寻找单独计算百分位数和群体数的解决方案,但我不知道如何计算这个移动窗口上的百分位数。
这里的任何建议都会有很大的帮助。
答案 0 :(得分:1)
df2 = df.assign(date=pd.to_datetime(df.Year.astype(str).add("-").add(df.Month.astype(str)).add("-").add(str(1))))
df2 = df2.set_index('date')
df2.groupby(['Area','Num','Type'])['Result'].rolling(12,min_periods=3).quantile(.9).reset_index()
输出:
Area Num Type date Result
0 AA 1 A 2015-01-01 NaN
1 AA 1 A 2015-02-01 NaN
2 AA 1 A 2015-03-01 2.0
3 AA 1 A 2015-04-01 3.0
4 AA 1 A 2015-05-01 4.0
5 AA 1 A 2015-06-01 5.0
6 AA 1 A 2015-07-01 6.0
7 AA 1 A 2015-08-01 7.0
8 AA 1 A 2015-09-01 8.0
9 AA 1 A 2015-10-01 9.0
10 AA 1 A 2015-11-01 10.0
11 AA 1 A 2015-12-01 10.0
12 BB 2 B 2015-01-01 NaN
13 BB 2 B 2015-02-01 NaN
14 BB 2 B 2015-03-01 2.0
15 BB 2 B 2015-04-01 3.0
16 BB 2 B 2015-05-01 4.0
17 BB 2 B 2015-06-01 5.0
18 BB 2 B 2015-07-01 6.0
19 BB 2 B 2015-08-01 7.0
20 BB 2 B 2015-09-01 8.0
21 BB 2 B 2015-10-01 9.0
22 BB 2 B 2015-11-01 10.0
23 BB 2 B 2015-12-01 10.0