Панды рейтинга в нескольких уровнях группового - PullRequest
0 голосов
/ 31 августа 2018

enter image description here Я пытаюсь выполнить сортировку по нескольким уровням группового многоиндексного фрейма данных на основе агрегированного значения. Для идеи о чем я говорю:

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

На уровне 0 значения должны быть ранжированы по убыванию на основе суммы упомянутой меры. Затем на уровне 1 значения должны быть ранжированы в порядке убывания снова на основе суммы указанной меры, уровня 2 и т. Д.

Как группировать, как сортировать на каждом уровне?

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

EDIT: Исходные данные:

pd.DataFrame(data=[['a','car',6], ['a','bike',7], ['a','car',8], ['b','bike',9], ['b','car',10], ['b','bike',11]], columns=['a', 'b', 'c'])

GroupBy:

df.groupby(['a','b']).agg({'c':'sum'})

Желаемый выход после сброса индекса:

 pd.DataFrame(data=[['b','bike',20], ['b','car',10], ['a','car',14], ['a','bike',7]], columns=['a', 'b', 'c'])

1 Ответ

0 голосов
/ 31 августа 2018

Обновленный ответ

Я разделю это на несколько этапов (обратите внимание, что я изменил имена ваших столбцов для ясности, т.е. df.columns=['Col1','Col2','Col3']):

   Col1  Col2  Col3
0    a   car     6
1    a  bike     7
2    a   car     8
3    b  bike     9
4    b   car    10
5    b  bike    11 

Шаг 1

Сначала мы хотим groupby('Col1') и использовать transform(sum) для преобразования кадра данных на основе суммы значений в Col3, связанных с данной группой. Это устанавливает ваш заказ на Col1, используя sort_values('Col3', ascending=False) для сохранения результирующего индекса и используя его для установки индекса исходного кадра данных df.

step1 = df.iloc[df.groupby('Col1').transform(sum).sort_values('Col3', ascending=False).index]

Что дает:

   Col1  Col2  Col3
3    b  bike     9
4    b   car    10
5    b  bike    11
0    a   car     6
1    a  bike     7
2    a   car     8 

Шаг 2

Теперь мы можем просто сгруппировать по Col1 и Col2, используя sort=False, чтобы сохранить порядок сортировки из шага 1, и агрегировать на основе суммы Col3. Используйте reset_index() для очистки индекса и восстановления исходных столбцов.

step2 = step1.groupby(['Col1','Col2'], sort=False).agg({'Col3': 'sum'}).reset_index()

Ваш желаемый результат:

   Col1  Col2  Col3
0    b  bike    20
1    b   car    10
2    a   car    14
3    a  bike     7
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...