2015-09-04 90 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()) 

现在,它的工作。