2016-11-11 88 views
1

我看大部分以前问过的问题,但没能找到我的问题的答案的总和:熊猫:集团由两列得到另一列

我有以下data.frame

  id year month score num_attempts 
0  483625 2010 01 50  1 
1  967799 2009 03 50  1 
2  213473 2005 09 100  1 
3  498110 2010 12 60  1 
5  187243 2010 01 100  1 
6  508311 2005 10 15  1 
7  486688 2005 10 50  1 
8  212550 2005 10 500  1 
10  136701 2005 09 25  1 
11  471651 2010 01 50  1 

我希望得到以下数据帧

year month sum_score sum_num_attempts 
2009 03 50   1 
2005 09 125   2 
2010 12 60   1 
2010 01 200   2 
2005 10 565   3 

这里是我的尝试:

sum_df = df.groupby(by=['year','month'])['score'].sum() 

但这看起来效率和正确。如果我有多个列需要聚合,这看起来像一个非常昂贵的电话。例如,如果我有另一列num_attempts,只想按年份总和作为分数。

+0

你能否解释一下为什么你认为这是一个广阔的电话,如果你想保持它在集团化运作,你会用'num_attempts'做什么呢? – Boud

+0

@MaxU不确定我是否理解使用'as_index = False,那是干什么的? –

+1

抱歉我的第一条评论 - 我误解了你。有什么问题:'df.groupby(['year','month'])[['score','num_attempts']]。sum()'或'df.groupby(['year','month' ])。agg({'score':'sum','num_attempts':'max'})'? – MaxU

回答

3

这应该是一个有效的方法:

sum_df = df.groupby(['year','month']).agg({'score': 'sum', 'num_attempts': 'sum'}) 
+0

'score'列是否必须是显式整数? –

+0

@ Null-Hypothesis我不这么认为。如果它不起作用,你会详细说明吗? –