2014-09-12 79 views
1

我试图了解/使用熊猫的GROUPBY将各组内获得最大的计数,然后用最大计数Python的大熊猫GROUPBY行为

df = pd.DataFrame({'name':['alpha','beta','gamma','delta','epsilon'], 'year':[2000,2001,2000,2001,2000], 'count':[1,25,11,20,8]}) 
df 


    count name year 
0 1  alpha 2000 
1 25  beta 2001 
2 11  gamma 2000 
3 20  delta 2001 
4 8  epsilon 2000 

df.groupby('year').max() 

     count name 
year   
2000 11  gamma 
2001 25  delta 

我通过一年,但我的分组返回的行像输出d的样子:

 count name 
year   
2000 11  gamma 
2001 25  beta 

所以,我想从每个组返回整行(由“年”)的基础上最大计数。我也不清楚2001年为什么在名称而不是“测试版”中返回“三角洲”(正如我所期望的那样)。

+0

它给出delta的原因是,当你直接对groupby对象执行'.max()'时,它会为每列分别计算最大值。 '“delta”在字母表后面,因此“大于”'“beta”'。 – BrenBarn 2014-09-12 19:38:13

回答

1

您可以使用idxmax收集最大行的索引,然后用df.iloc选择行:

In [73]: df.iloc[df.groupby('year')['count'].idxmax()].set_index('year') 
Out[73]: 
     count name 
year    
2000  11 gamma 
2001  25 beta 

注意df.groupby('year').max()是找到max为每列 - 无论是countname。这就是为什么deltaname列中被选为max的原因。

如果你只在最大计数兴趣,然后用

df.groupby('year')['count'].max() 

df.groupby('year')DataFrameGroupBy对象。 df.groupby('year')['count']是一个SeriesGroupBy对象。对SeriesGroupBy对象的maxidxmax的呼叫仅使用count列中的值。这种限制GroupBy对象的方法是documented here

+0

@unubtu:你能解释一下:(i)为什么我的命令返回delta而不是beta?和(ii)“df.groupby('year')['count']”是做什么的?我理解df.groupby('year'),但我无法破译“['count']”部分 – slaw 2014-09-12 19:38:15

0

您可以使用常规groupby().apply并返回count等于组的最大值count的行。正如在另一个答案中,​​用于摆脱额外的year列。

 
>>> df = pd.DataFrame({'name':['alpha','beta','gamma','delta','epsilon'], 'year':[2000,2001,2000,2001,2000], 'count':[1,25,11,20,8]}) 

>>> df.groupby("year").apply(lambda g: g[g["count"] == g["count"].max()]).set_index("year") 
     count name 
year    
2000  11 gamma 
2001  25 beta