[英]Pandas Windowing with Groupby not Working as Expected
我有一個pandas數據框,正在嘗試按列分組后計算擴展的窗口聚合。 數據結構是這樣的:
df = pd.DataFrame([['A',1,2015,4],['A',1,2016,5],['A',1,2017,6],['B',1,2015,10],['B',1,2016,11],['B',1,2017,12],
['A',1,2015,24],['A',1,2016,25],['A',1,2017,26],['B',1,2015,30],['B',1,2016,31],['B',1,2017,32],
['A',2,2015,4],['A',2,2016,5],['A',2,2017,6],['B',2,2015,10],['B',2,2016,11],['B',2,2017,12]],columns=['Typ','ID','Year','dat'])\
.sort_values(by=['Typ','ID','Year'])
即
Typ ID Year dat
0 A 1 2015 4
6 A 1 2015 24
1 A 1 2016 5
7 A 1 2016 25
2 A 1 2017 6
8 A 1 2017 26
12 A 2 2015 4
13 A 2 2016 5
14 A 2 2017 6
3 B 1 2015 10
9 B 1 2015 30
4 B 1 2016 11
10 B 1 2016 31
5 B 1 2017 12
11 B 1 2017 32
15 B 2 2015 10
16 B 2 2016 11
17 B 2 2017 12
我需要按Type
和ID
列將此數據框分組,然后按Year
計算所有觀測值的擴展均值。 我寫的代碼是
df.groupby(by=['Typ','ID','Year']).expanding().mean().reset_index()
從中我期望這樣的輸出結果(忽略level_3
):
Typ ID Year level_3 dat
0 A 1 2015 6 14.0
1 A 1 2016 7 14.5
2 A 1 2017 8 15.0
3 A 2 2015 12 4.0
4 A 2 2016 13 4.5
5 A 2 2017 14 5.0
6 B 1 2015 9 20.0
7 B 1 2016 10 20.5
8 B 1 2017 11 21.0
9 B 2 2015 15 10.0
10 B 2 2016 16 10.5
11 B 2 2017 17 11.0
按['Type','ID','Year']
分組將為這些列的每個唯一行產生一行。 相反,代碼給出了以下內容:
Typ ID Year level_3 dat
0 A 1 2015 0 4.0
1 A 1 2015 6 14.0
2 A 1 2016 1 5.0
3 A 1 2016 7 15.0
4 A 1 2017 2 6.0
5 A 1 2017 8 16.0
6 A 2 2015 12 4.0
7 A 2 2016 13 5.0
8 A 2 2017 14 6.0
9 B 1 2015 3 10.0
10 B 1 2015 9 20.0
11 B 1 2016 4 11.0
12 B 1 2016 10 21.0
13 B 1 2017 5 12.0
14 B 1 2017 11 22.0
15 B 2 2015 15 10.0
16 B 2 2016 16 11.0
17 B 2 2017 17 12.0
鑒於邏輯, expanding()
窗口函數似乎無法正確地與groupby
配合使用,或者至少它的行為不如我預期。 我究竟做錯了什么?
編輯:我現在看到我在做什么錯,因為我期待之間不同的集成groupby
和expanding
。 所以現在我的問題是,如何使用熊貓來獲得所需的輸出-無需任何手動迭代。
據我所知,擴展均值具有不同的計算方式。 對於所需的輸出,我將結合使用groupby
和cumsum
,然后在sum
和count
之間進行簡單的划分:
newDf = df.groupby(['Typ','ID','Year'])['dat'].agg(('sum', 'count')).groupby(['Typ','ID']).cumsum()
newDf['dat'] = newDf['sum']/newDf['count']
newDf = newDf.reset_index().drop(['count', 'sum'], axis = 1)
輸出:
Typ ID Year dat
0 A 1 2015 14.0
1 A 1 2016 14.5
2 A 1 2017 15.0
3 A 2 2015 4.0
4 A 2 2016 4.5
5 A 2 2017 5.0
6 B 1 2015 20.0
7 B 1 2016 20.5
8 B 1 2017 21.0
9 B 2 2015 10.0
10 B 2 2016 10.5
11 B 2 2017 11.0
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.