2014-09-12 76 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