2016-07-19 2 views
1

Каждая строка в моей DataFrame - это голосовая запись пользователя для ресторана. Данные выглядят какpython pandas сортировка по группам

id cuisine  
91 american 
3 american 
91 american 
233 cuban  
233 cuban  
2 cuban  

где id относится к ресторану.

Я хочу, чтобы получить что-то вроде следующего

american 91 100 
      3 30 
      12 10 
cuban  233 80 
      2 33 
mexican 22 99 
      8 98 
      21 82 

где второй столбец является id, а третий столбец является число строк в DataFrame для этого id. Другими словами, сортируйте по количеству строк, но группируйте по кухне. Я попробовал

g = df.groupby(['cuisine', 'id']) 
c = g.size().sort_values(ascending=False) 

Но порядок блюд смешанный.

+2

Пожалуйста, пост пример DataFrame. – Alex

+0

взгляните на сводные таблицы: http://pandas.pydata.org/pandas-docs/stable/generated/pandas.pivot_table.html –

ответ

2

использование value_counts после group_by с последующим sort_index

# ascending=[1, 0] says True for level[0], False for level[1] 
df.groupby('cuisine').id.value_counts().sort_index(ascending=[1, 0]) 

cuisine id 
american 91  2 
      3  1 
cuban  233 2 
      2  1 
Name: id, dtype: int64 
+0

это намного лучше, по сравнению с моим ... – MaxU

+0

Спасибо @MaxU :-) – piRSquared

+0

'value_counts()' сортируется по убыванию по умолчанию. Даже окончательный вид можно сохранить! – nos

2

это то, что вы хотите?

In [2]: df 
Out[2]: 
    id cuisine 
0 91 american 
1 3 american 
2 91 american 
3 233  cuban 
4 233  cuban 
5 2  cuban 

In [3]: df.groupby(['cuisine', 'id']).size() 
Out[3]: 
cuisine id 
american 3  1 
      91  2 
cuban  2  1 
      233 2 
dtype: int64 

или в виде кадра данных:

In [10]: df.groupby(['cuisine', 'id']).size().reset_index(name='count').sort_values(['cuisine', 'count'], ascending=[1,0]) 
Out[10]: 
    cuisine id count 
1 american 91  2 
0 american 3  1 
3  cuban 233  2 
2  cuban 2  1 
+0

Извините, мой пример был слишком простым. По моим реальным данным, если я делаю то, что вы предложили, то подсчет в кухне не сортируется. – nos

+0

@ nos, я обновил свой ответ - пожалуйста, проверьте. Пожалуйста, предоставьте [воспроизводимый образец и требуемые наборы данных] (http://stackoverflow.com/questions/20109391/how-to-make-good-reproducible-pandas-examples) в будущем – MaxU

+0

@nos, пожалуйста, проверьте [решение piRSquared] (http://stackoverflow.com/a/38464909/5741205) - это намного лучше – MaxU

Смежные вопросы