Пандас сортирует мультииндекс на основе агрегации столбца, если бы я рассматривал только один уровень индекса - PullRequest
0 голосов
/ 17 января 2019

Какой самый быстрый способ сортировки кадра данных city_sales_rep по индексу 'city', имейте в виду, что на месте есть мультииндекс. Порядок индекса должен точно соответствовать порядку, в котором индекс упорядочен во втором кадре данных город .

Если есть простой и быстрый способ выполнить эту сортировку за один раз?

A = pd.DataFrame(np.random.randint(2,10,(10,3))) 
A.columns = ['city','sales_rep','sales']

city_sales_rep = A.groupby(['city','sales_rep']).sum()

city = A.groupby(['city'])['sales'].sum().sort_values()

Что приводит в моем примере к city_sales_rep :

                sales
city sales_rep       
2    9              5
4    5              2
     7              5
     9              2
5    4              4
6    8              6
     9              9
7    2              2
     3              8
     6              4

А Город

      sales
city       
5         4
2         5
4         9
7        14
6        15

Хотя это, кажется, делает то, что я хочу, оно кажется ужасно неэффективным:

city.join(city_sales_rep.reset_index(level=1),lsuffix='_x')[['sales_rep','sales']].reset_index().set_index(['city','sales_rep'])

P.S .: Изменения в названии приветствуются, я чувствую, что это несколько неуклюже.

1 Ответ

0 голосов
/ 17 января 2019

Одно возможное решение, но не уверен в производительности:

np.random.seed(2019)
A = pd.DataFrame(np.random.randint(2,10,(10,3))) 
A.columns = ['city','sales_rep','sales']

city_sales_rep = A.groupby(['city','sales_rep']).sum()
a = np.argsort(city_sales_rep.groupby(['city'])['sales'].transform('sum'))
city_sales_rep = city_sales_rep.iloc[a]
print (city_sales_rep)
                sales
city sales_rep       
8    2              7
7    2              8
6    2              9
9    6              4
     7              9
2    2              9
     4              9
     6              7
     7              5

Еще один солутон с новым столбцом:

city_sales_rep = A.groupby(['city','sales_rep']).sum()
city_sales_rep['new'] = city_sales_rep.groupby(['city'])['sales'].transform('sum')
city_sales_rep = city_sales_rep.sort_values('new')
print (city_sales_rep)
                sales  new
city sales_rep            
8    2              7    7
7    2              8    8
6    2              9    9
9    6              4   13
     7              9   13
2    2              9   30
     4              9   30
     6              7   30
     7              5   30

Если возможно, дублировать sum для разных cities и использовать панды 0.23.0+, возможна сортировка по уровню и столбцу вместе, отметьте docs

city_sales_rep = city_sales_rep.sort_values(['new','city'])
print (city_sales_rep)
                sales  new
city sales_rep            
8    2              7    7
7    2              8    8
6    2              9    9
9    6              4   13
     7              9   13
2    2              9   30
     4              9   30
     6              7   30
     7              5   30
...