2014-09-12 2 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, заключается в том, что когда вы делаете '.max()' непосредственно на объекте groupby, он вычисляет max отдельно для каждого столбца. '' delta "' позже в алфавите и, следовательно, «больше, чем» '« бета ». – BrenBarn

ответ

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 для каждого столбца - как count и name. Вот почему delta выбирался как max в столбце name.

Если вы заинтересованы только в максимальном счете, а затем использовать

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

df.groupby('year') является DataFrameGroupBy объектом. df.groupby('year')['count'] - SeriesGroupBy объект. Вызов max или idxmax объекта SeriesGroupBy использует значения только из столбца count. Этот метод ограничения объекта GroupBy равен documented here.

+0

@unubtu: Можете ли вы объяснить: (i) почему моя команда возвращает delta вместо бета-версии? и (ii) что делает «df.groupby ('year') ['count']" do? Я понимаю df.groupby («год»), но я не могу расшифровать часть «[count»] – slaw

0

Вы можете использовать общее число groupby().apply и возвращать строки, размер которых count равен максимальным count группы. Как и в другом ответе, set_index используется, чтобы избавиться от дополнительной колонки 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 
Смежные вопросы