2015-09-04 94 views
1

我有一個熊貓數據幀matches包含比賽結果如下:創建新的數據幀和聚合

year winner  loser score 
1990 A   B  6-0 
1990 B   C  5-0 RET 
1990 A   B  4-0 RET 
1990 C   C  6-0 
1991 A   B  6-1 
1991 A   C  4-1 RET 
1991 B   A  6-4 
1991 C   A  3-0 RET 

我想創建一個包含損失勝新數據幀每年退役。 最終輸出768,16樣子:

year player  wins losses  rets 
1990 A   2  0   1 
1990 B   1  2   1 
1990 C   1  2   0 
1991 A   2  2   1 
1991 B   1  1   0 
1991 C   1  1   1 

對於勝利和失敗,我可以成功地做到這一點。 我做的:

w_group = matches.groupby(['year', 'winner']).size() 
l_group = matches.groupby(['year', 'loser']).size() 

,然後創建一個新的數據框:

scores = pd.DataFrame({'wins' : w_group, 'losses' : l_group}).fillna(0) 
#name the index 
scores.index.names = ['year','player'] 

然而,通過退休,我不知道如何實現列計算勝。我嘗試這樣做:

ret_group = matches.groupby(['year', 'winner']).apply(lambda x: x[(x['score'].str.contains('RET').fillna(False))].count()) 

但是這給了我以下異常:

raise KeyError('%s not in index' % objarr[mask]) 
KeyError: '[ 0.] not in index' 

您的解決方案是高度讚賞

+0

你的代碼適用於我(Python 3.4.3,pandas 0.16.2)。 – IanS

+0

它會產生預期的結果嗎?也就是說,帶有列的新數據框,勝/損/退? – beta

+0

我得到一個包含以下列的數據框:「年」,「勝者」,「失敗者」,「得分」和「得分」表示你正在尋找的結果('[1,1, 0,1,0,1]')。 – IanS

回答

0

我改變

ret_group = matches.groupby(['year', 'winner']).apply(lambda x: x[(x['score'].str.contains('RET').fillna(False))].count()) 

ret_group = matches.groupby(['year', 'winner']).apply(lambda x: (x['score'].str.contains('RET').fillna(False)).sum()) 

現在,它的工作。