Как отсортировать данные по окончательному выводу? - PullRequest
2 голосов
/ 09 мая 2020

Я хочу сгруппировать свой фрейм данных по двум столбцам, а затем отсортировать агрегированные результаты по группам.

In [167]:df

count   job source
0   2   sales   A
1   4   sales   B
2   6   sales   C
3   3   sales   D
4   7   sales   E
5   5   market  A
6   3   market  B
7   2   market  C
8   4   market  D
9   1   market  E
df.groupby(['job','source']).agg({'count':sum})
Out[168]:

job     source  count
market  A   5
        B   3
        C   2
        D   4
        E   1
sales   A   2
        B   4
        C   6
        D   3
        E   7

Теперь я хотел бы для сортировки столбца счетчика в порядке убывания в каждой из групп. А потом возьмите только три верхних ряда. Чтобы получить что-то вроде:

job     source  count
market  A   5
        D   4
        B   3
sales   E   7
        C   6
        B   4

Я хочу дополнительно отсортировать эту проблему по job, поэтому, если сумма подсчета продаж больше, я хочу, чтобы данные были напечатаны как

job     source  count
sales   E   7
        C   6
        B   4
market  A   5
        D   4
        B   3

Я не могу получить работу в пятерке лучших

Ответы [ 2 ]

2 голосов
/ 09 мая 2020

IIU C, мы можем сделать еще groupby и использовать nlargest(3), чтобы получить верхние n значений.

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

s = df.groupby(['job','source']).agg({'count':sum}).groupby(level=0)['count']\
.nlargest(3).reset_index(0,drop=True).to_frame()


# see which of your indices is higher and create a sorting list.

sorter = s.groupby(level=0)['count'].sum().sort_values(ascending=False).index
#Index(['sales', 'market'], dtype='object', name='job')

s['sort'] = pd.Categorical(s.index.get_level_values(0),sorter)


df2 = s.sort_values('sort').drop('sort',axis=1)

print(df2)

               count
job    source       
sales  E           7
       C           6
       B           4
market A           5
       D           4
       B           3
0 голосов
/ 09 мая 2020

Вы можете использовать sort_values, упомянутый в другом аналогичном ответе сортировку после агрегирования и снова group по job, чтобы получить верхние N из задания, например,

>>> df
   count     job source
0      2   sales      A
1      4   sales      B
2      6   sales      C
3      3   sales      D
4      7   sales      E
5      5  market      A
6      3  market      B
7      2  market      C
8      4  market      D
9      1  market      E
>>> agg = df.groupby(['job','source']).agg({'count':sum})
>>> agg
               count
job    source       
market A           5
       B           3
       C           2
       D           4
       E           1
sales  A           2
       B           4
       C           6
       D           3
       E           7
>>> agg.reset_index().sort_values(['job', 'count'], ascending=False).set_index(['job', 'source']).groupby('job').head(3)
               count
job    source       
sales  E           7
       C           6
       B           4
market A           5
       D           4
       B           3
>>> 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...