#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