Сортировать дважды сгруппированные df по значению столбца, соответствующего только одной из групп - PullRequest
1 голос
/ 17 января 2020

У меня есть pd.DataFrame, что является результатом .groupby(['Product', 'Salesperson']).sum(). Теперь я хотел бы отсортировать столбец «Продукт» в порядке «Продажи по продуктам» (не «Продажи по продуктам» и «Продавец»). Затем внутри каждой группы продуктов сортируйте по продажам каждого продавца.

Вот мой старт df:

sample

А вот мой желаемый ответ a1 с некоторыми примечаниями, чтобы уточнить процесс заказа:

desired-answer

Ниже приведены мой образец df и мой желаемый ответ a1 с простой тест утверждения.

import pandas as pd
from pandas.util.testing import assert_frame_equal
import numpy as np

s1 = {'Product': {0: 'Soap',
                  1: 'Soap',
                  2: 'Pencil',
                  3: 'Paper',
                  4: 'Paper',
                  5: 'Bags',
                  6: 'Bags'},
      'Salesperson': {0: 'Jack',
                      1: 'Jill',
                      2: 'Jill',
                      3: 'Jack',
                      4: 'Barry',
                      5: 'Barry',
                      6: 'Jack'},
      'Sales': {0: 40, 1: 20, 2: 500, 3: 50, 4: 10, 5: 450, 6: 100}}

a1 = {'Product': {0: 'Bags',
                  1: 'Bags',
                  2: 'Pencil',
                  3: 'Paper',
                  4: 'Paper',
                  5: 'Soap',
                  6: 'Soap'},
      'Salesperson': {0: 'Barry',
                      1: 'Jack',
                      2: 'Jill',
                      3: 'Jack',
                      4: 'Barry',
                      5: 'Jack',
                      6: 'Jill'},
      'Sales': {0: 450, 1: 100, 2: 500, 3: 50, 4: 10, 5: 40, 6: 20}}

df = pd.DataFrame(s1).set_index(['Product', 'Salesperson']) # sample
a1 = pd.DataFrame(a1).set_index(['Product', 'Salesperson']) # desired answer

print(df)
print(a1)

def my_sort(df):
    raise NotImplementedError

my_answer = my_sort(df)

assert_frame_equal(my_answer, a1)

1 Ответ

2 голосов
/ 17 января 2020

Вы можете groupby с помощью 'Product' и создать фиктивные столбцы 'sum' и 'max', которые можно использовать путем сортировки:

g = df.groupby('Product')['Sales']
df['sum'] = g.transform('sum')
df['max'] = g.transform('max')
df.sort_values(['sum', 'max', 'Sales'], ascending=False)\
.drop(['sum', 'max'], axis=1)

Вывод:

                     Sales
Product Salesperson       
Bags    Barry          450
        Jack           100
Pencil  Jill           500
Paper   Jack            50
        Barry           10
Soap    Jack            40
        Jill            20
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...