Столбцы Groupby и сортировка значений по убыванию по количеству строк для каждой группы

#python #pandas #pandas-groupby

#python #pandas #pandas-groupby

Вопрос:

У меня есть фрейм данных (df) следующим образом:

  cluster    city    category    latitude    longitude   merchant
0   0   sanfran       10          39.072    -101.93253  merch2
1   0   sanfran       10          45.072    -110.93253  merch10
2   1   wichita       22          20.072    -100.93253  merch3
3   3   wichita        5          34.072    -99.93253   merch3
4   2   denver         1          40.072    -101.93253  merch1
5   1   longmont       4          30.072    -111.93253  merch2
6   1   longmont       4          30.072    -111.93253  merch2
7   3   topeka         5          20.072    -109.93253  merch1

  

И я хочу добраться до этого фрейма данных ‘dfout’

   cluster   merchant    latitude    longitude   city    category
0   0        merch10    45.072  -110.93253      sanfran   10
1   0        merch2     39.072  -101.93253      sanfran   10
2   1        merch2     30.072  -111.93253      longmont    4
3   1        merch3     20.070  -100.93253       wichita    22
4   2        merch1     40.072  -101.93253       denver     1
5   3        merch1     20.072  -109.93253        topeka    5
6   3        merch3     34.072  -99.93253        wichita    5
  

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

Я могу выполнить следующее, используя оператор grouby, однако вот где я застрял.

 df.groupby(['cluster','merchant']).count().sort_values(by='city',ascending=False)

                       city category    latitude    longitude
cluster merchant                
   1     merch2         2       2         2          2
   0    merch10         1       1         1          1
        merch2          1       1         1          1
   1    merch3          1       1         1          1
   2    merch1          1       1         1          1
   3    merch1          1       1        1           1
        merch3          1       1        1           1
  

Может кто-нибудь пролить свет на эту проблему, пожалуйста? как я могу перейти от df к dfout?

Спасибо

Ответ №1:

Это даст вам желаемый результат:

  1. Вам нужно использовать .agg с вашей .groupby и использовать first() функцию для всех столбцов, кроме одного, где вам нужно взять count (для целей сортировки позже. Я использовал cluster столбец).
  2. Поскольку я cluster дважды использовал столбец в .groupby , мне также пришлось переименовать его раньше .reset_index() , иначе возникла бы ошибка, связанная с наличием двух столбцов с одинаковым именем при сбросе индекса и приведении cluster в столбцы фрейма данных.
  3. Сортировка по критериям cluster и cluster_count и передача ascending=[True,False] , чтобы вы могли сортировать по возрастанию для первого и по убыванию для последнего. Наконец, удалите cluster_count столбец.

 df_out = df.copy()
df_out = (df_out.groupby(['cluster', 'merchant']).agg({'latitude' : 'first',
                                                  'longitude' : 'first',
                                                  'city' : 'first',
                                                  'category' : 'first',
                                                  'cluster' : 'count'})
          .rename({'cluster' : 'cluster_count'},axis=1).reset_index()
          .sort_values(['cluster', 'cluster_count'], ascending = [True, False])
          .drop('cluster_count', axis=1))
df_out
Out[1]: 
   cluster merchant  latitude  longitude      city  category
0        0  merch10    45.072 -110.93253   sanfran        10
1        0   merch2    39.072 -101.93253   sanfran        10
2        1   merch2    30.072 -111.93253  longmont         4
3        1   merch3    20.072 -100.93253   wichita        22
4        2   merch1    40.072 -101.93253    denver         1
5        3   merch1    20.072 -109.93253    topeka         5