Pandas - сортировка по совокупным столбцам в группе и фильтрация верхних n столбцов - PullRequest
1 голос
/ 14 апреля 2020

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

Фрагмент кода:

df_agg = top_cust_data.loc[(top_cust_data['Product'] == in_prod) 
              & (top_cust_data['Repay_Year'] == in_year)].groupby(['City',
                                                               'Customer']).agg(Total_Repay = ('Repay_Amt','sum'))
df_agg['Total_Repay'] = df_agg['Total_Repay'].astype(int)
df_agg

Набор данных

                 Total_Repay
City    Customer    
BANGALORE   A19 20443285
            A37 64589630
            A5  37223052
            A52 7233551
BOMBAY      A33 5174636
            A36 58074481
            A4  4006181
            A51 16802670
            A71 250440
CALCUTTA    A20 26162224
            A34 3952831
            A40 113358492
            A49 70989328
            A98 486616
            A99 259682
CHENNAI     A38 78389312
            A47 50881752
            A56 6948591
COCHIN      A21 93067291
            A3  9650990
            A35 5261360
            A41 63372356
            A50 23388118
            A54 691238
DELHI       A53 29025587
PATNA       A55 8000348
TRIVANDRUM  A39 37606828
            A48 55244011
            A97 269952

Как go об этом, пожалуйста, предложите? Любые предложения будут высоко оценены.

1 Ответ

2 голосов
/ 14 апреля 2020

В последних версиях pandas возможна сортировка уровней MultiIndex по именам столбцов, поэтому сначала используйте DataFrame.sort_values, а затем группируйте по первому уровню с GroupBy.head:

df = df.sort_values(['City','Total_Repay'], ascending=[True, False]).groupby(level=0).head(3)
print (df)
                     Total_Repay
City       Customer             
BANGALORE  A37          64589630
           A5           37223052
           A19          20443285
BOMBAY     A36          58074481
           A51          16802670
           A33           5174636
CALCUTTA   A40         113358492
           A49          70989328
           A20          26162224
CHENNAI    A38          78389312
           A47          50881752
           A56           6948591
COCHIN     A21          93067291
           A41          63372356
           A50          23388118
DELHI      A53          29025587
PATNA      A55           8000348
TRIVANDRUM A48          55244011
           A39          37606828
           A97            269952
...