Как получить топ-3 продаж в фрейме данных после использования group by и сортировки в python?

#python

#python

Вопрос:

недавно я делаю с этим набором данных

     import pandas as pd

data = {'Product':['Box','Bottles','Pen','Markers','Bottles','Pen','Markers','Bottles','Box','Markers','Markers','Pen'], 
        'State':['Alaska','California','Texas','North Carolina','California','Texas','Alaska','Texas','North Carolina','Alaska','California','Texas'], 
        'Sales':[14,24,31,12,13,7,9,31,18,16,18,14]}
 
df1=pd.DataFrame(data, columns=['Product','State','Sales']) 
df1
  

Я хочу найти 3 группы с самыми высокими продажами

 grouped_df1 = df1.groupby('State')
grouped_df1.apply(lambda x: x.sort_values(by = 'Sales', ascending=False))
  

Итак, у меня есть фрейм данных, подобный этому

введите описание изображения здесь

Теперь я хочу найти топ-3 состояния с самыми высокими продажами. Я пытался использовать

 grouped_df1.apply(lambda x: x.sort_values(by = 'Sales', ascending=False)).head(3)
# It gives me the first three rows
grouped_df1.apply(lambda x: x.sort_values(by = 'Sales', ascending=False)).max()
#It only gives me the maximum value
  

Ожидаемый результат должен быть:

 Texas: 31
California: 24
North Carolina: 18
  

Таким образом, как я могу это исправить? Потому что иногда у штата может быть 3 самых высоких продаж, например, у Аляски может быть 3 самых высоких продаж. Когда я просто сортирую его, топ-3 будет Alaska, и он не может найти 2 другие группы.

Большое спасибо!

Комментарии:

1. можете ли вы опубликовать ожидаемый результат на основе df1

2. @Kenan Да, конечно. Извините, мой вопрос недостаточно ясен.

Ответ №1:

Вы могли бы добавить новый столбец с именем Sales_Max_For_State , а затем использовать drop_duplicates и nlargest:

 >>> df1['Sales_Max_For_State'] = df1.groupby(['State'])['Sales'].transform(max)
>>> df1
    Product           State  Sales  Sales_Max_For_State
0       Box          Alaska     14                   16
1   Bottles      California     24                   24
2       Pen           Texas     31                   31
3   Markers  North Carolina     12                   18
4   Bottles      California     13                   24
5       Pen           Texas      7                   31
6   Markers          Alaska      9                   16
7   Bottles           Texas     31                   31
8       Box  North Carolina     18                   18
9   Markers          Alaska     16                   16
10  Markers      California     18                   24
11      Pen           Texas     14                   31
>>> df2 = df1.drop_duplicates(['Sales_Max_For_State']).nlargest(3, 'Sales_Max_For_State')[['State', 'Sales_Max_For_State']]
>>> df2
            State  Sales_Max_For_State
2           Texas                   31
1      California                   24
3  North Carolina                   18
  

Ответ №2:

Я думаю, что есть несколько способов сделать это:

1-
df1.groupby('State').agg({'Sales': 'max'}).sort_values(by='Sales', ascending=False).iloc[:3]

2- df1.groupby('State').agg({'Sales': 'max'})['Sales'].nlargest(3)

                 Sales
State
Texas              31
California         24
North Carolina     18