2016-08-25 5 views
2

У меня есть dataframe с колоннами, как это:Список самых распространенных в группе Pandas?

 id       lead_sponsor lead_sponsor_class 
    02837692 Janssen Research & Development, LLC   Industry 
    02837679    Aarhus University Hospital    Other 
    02837666 Universidad Autonoma de Ciudad Juarez    Other 
    02837653   Universidad Autonoma de Madrid    Other 
    02837640   Beirut Eye Specialist Hospital    Other 

Я хочу найти наиболее распространенные спонсор свинца. Я могу перечислить размер каждой группы с помощью:

df.groupby(['lead_sponsor', 'lead_sponsor_class']).size() 

, который дает мне это:

lead_sponsor        lead_sponsor_class 
307 Hospital of PLA      Other     1 
3E Therapeutics Corporation    Industry    1 
3M          Industry    4 
4SC AG         Industry    8 
5 Santé         Other     1 

Но как я могу найти 10 самых распространенных групп? Если я:

df.groupby(['lead_sponsor', 'lead_sponsor_class']).size().sort_values(ascending=False).head(10) 

Тогда я получаю сообщение об ошибке:

AttributeError: 'Series' object has no attribute 'sort_values'

+0

Для меня также работает ваше решение. – jezrael

ответ

2

Я думаю, что вы можете использовать Series.nlargest:

print (df.groupby(['lead_sponsor', 'lead_sponsor_class']).size().nlargest(10)) 

В docs является Примечания:

Faster than .sort_values(ascending=False).head(n) for small n relative to the size of the Series object.

Образец:

import pandas as pd 

df = pd.DataFrame({'id': {0: 2837692, 1: 2837679, 2: 2837666, 3: 2837653, 4: 2837640}, 
        'lead_sponsor': {0: 'a', 1: 'a', 2: 'a', 3: 's', 4: 's'}, 
        'lead_sponsor_class': {0: 'Industry', 1: 'Other', 2: 'Other', 3: 'Other', 4: 'Other'}}) 

print (df) 
     id lead_sponsor lead_sponsor_class 
0 2837692   a   Industry 
1 2837679   a    Other 
2 2837666   a    Other 
3 2837653   s    Other 
4 2837640   s    Other 

print (df.groupby(['lead_sponsor', 'lead_sponsor_class']).size()) 
lead_sponsor lead_sponsor_class 
a    Industry    1 
       Other     2 
s    Other     2 
dtype: int64 

print (df.groupby(['lead_sponsor', 'lead_sponsor_class']).size().sort_values(ascending=False).head(2)) 
lead_sponsor lead_sponsor_class 
s    Other     2 
a    Other     2 
dtype: int64 

print (df.groupby(['lead_sponsor', 'lead_sponsor_class']).size().nlargest(2)) 
lead_sponsor lead_sponsor_class 
a    Other     2 
s    Other     2 
dtype: int64 
+0

ДА! Спасибо! – Richard

+0

Именно поэтому я понимаю это - результат вызова '.size()' a Series? Я думаю, что я был сбит с толку, потому что он выглядит как dataframe, а не сериал (как он печатает два столбца слева). – Richard

+0

Да, это «Серия». Вы можете проверить его с помощью 'print (type (df.groupby (['lead_sponsor', 'lead_sponsor_class']). Size()))' '' – jezrael