2014-01-13 130 views
4

我有一個DataFrame df其中每個記錄代表一個足球比賽。小組將出現不止一次。我需要爲每個球隊得分計算某種滾動平均值(呃,不完全是這封信的滾動平均值)。將累積平均函數應用於分組對象

 date   home   away  score_h score_a 
166 2013-09-01  Fulham   Chelsea  0  0 
167 2013-09-03  Arsenal  Everton  0  2 
164 2013-09-05  Arsenal  Swansea  5  1 
165 2013-09-06  Fulham   Norwich  0  1 
163 2013-09-18  Arsenal  Swansea  0  0 

我需要計算的是每個團隊(主客場)的平均分數。

爲了簡便起見,我們只是做家居柱:

grouped = df.groupby('home') 
grouped = grouped.sort_index(by='date') # rows inside groups must be in asc order 

這導致:

date home away score_h  score_a 
home       
Arsenal  167  2013-09-03 Arsenal  Everton  0 2 
      164  2013-09-05 Arsenal  Swansea  5 1 
      163  2013-09-18 Arsenal  Swansea  0 0 
Fulham  166  2013-09-01 Fulham  Chelsea  0 0 
      165  2013-09-06 Fulham  Norwich  0 1 

的問題在這裏開始

現在,我需要計算「滾動平均值「對於團隊。我們手工爲Arsenal這個小組做手工。在這個結尾,我們應該結束2列,讓我們打電話給他們:rmean_hrmean_a。組中的第一條記錄(167)的得分爲02。其中的rmean分別是02。對於組中的第二條記錄(164),rmeans將爲(0+5)/2 = 2.5(2+1)/2 = 1.5,對於第三條記錄,則爲(0+5+0)/3 = 1.66(2+1+0)/3 = 1

我們的數據框現在應該是這樣的:

    date  home   away score_h score_a rmean_h rmean_a 
home       
Arsenal  167  2013-09-03 Arsenal  Everton  0 2 0  2 
      164  2013-09-05 Arsenal  Swansea  5 1 2.5  1.5 
      163  2013-09-18 Arsenal  Swansea  0 0 1.66 1 
Fulham  166  2013-09-01 Fulham  Chelsea  0 0 
      165  2013-09-06 Fulham  Norwich  0 1 

我要進行這些計算爲我的數據,你有什麼建議嗎?

回答

6

您可以將一個expanding_mean(見docs)各組:

grouped = df.sort(columns='date').groupby('home') 
grouped['score_h'].apply(pd.expanding_mean) 
+1

如果你想要的結果,如你的問題,你需要設置'home'爲索引(GROUPBY不會那麼做爲你)。例如。類似'df = df.set_index('home',drop = False,append = True).reorder_levels([1,0])。sort_index()' – joris

+1

不需要lambda;你可以直接'.apply(pd.expanding_mean)'。 – DSM

+0

@DSM啊,的確如此。謝謝!我改編了我的答案。 – joris