Как создать двухуровневую группу из n лучших элементов

У меня есть этот фрейм данных

          STATE              County            POP
1       Alabama      Autauga County          54571
2       Alabama      Baldwin County         182265
3       Alabama      Barbour County          27457
4       Alabama         Bibb County          22915
5       Alabama       Blount County          57322
6       Alabama      Bullock County          10914
7       Alabama       Butler County          20947
8       Alabama      Calhoun County         118572
...
3162  Wisconsin     Washburn County          15911
3163  Wisconsin   Washington County         131887
3164  Wisconsin     Waukesha County         389891
3165  Wisconsin      Waupaca County          52410
3166  Wisconsin     Waushara County          24496
3167  Wisconsin    Winnebago County         166994
3168  Wisconsin         Wood County          74749
....
3182    Wyoming      Natrona County          75450
3183    Wyoming     Niobrara County           2484
3184    Wyoming         Park County          28205
3185    Wyoming       Platte County           8667
3186    Wyoming     Sheridan County          29116

Как сгруппировать данные по штатам и округам, чтобы отобразить первые 3 округа каждого штата?

    STATE              COUNTY            POP
  Alabama      Baldwin County         182265
               Calhoun County          18572
                Blount County          57322
Wisconsin     Waukesha County         389891
             Winnebago County         166994
            Washington County         131887
  Wyoming         Park County          28205
               Natrona County          75450
              Sheridan County          29116

Я старался

df.sort_values('POP',ascending=False).groupby(['STATE','COUNTY']).sum().head(3)

но он показывает только первые 3 записи, но я хотел 3 лучших для каждой группы

                         POP
  STATE         COUNTY
Alabama Autauga County  54571
        Baldwin County  182265
        Barbour County  27457
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
32
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Используйте DataFrame.sort_values на 2 столбца с GroupBy.head:

#if necessary
#df = df.groupby(['STATE','County'], as_index=False).sum()

df = df.sort_values(['STATE','POP'], ascending=[True, False]).groupby('STATE').head(3)
print (df)
          STATE             County     POP
2       Alabama     Baldwin County  182265
8       Alabama     Calhoun County  118572
5       Alabama      Blount County   57322
3164  Wisconsin    Waukesha County  389891
3167  Wisconsin   Winnebago County  166994
3163  Wisconsin  Washington County  131887
3182    Wyoming     Natrona County   75450
3186    Wyoming    Sheridan County   29116
3184    Wyoming        Park County   28205

Если нужно MultiIndex добавьте DataFrame.set_index:

df = (df.sort_values(['STATE','POP'], ascending=[True, False])
        .groupby('STATE')
        .head(3)
        .set_index(['STATE','County'])

Спасибо за быстрый ответ, это так!

CW Gan 10.04.2019 10:40

Используйте groupby дважды и используйте nlargest, затем reset_index:

(df.groupby(['STATE', 'County'])['POP'].sum()
 .groupby(level=0, group_keys=False).nlargest(3).reset_index())

       STATE             County     POP
0    Alabama     Baldwin County  182265
1    Alabama     Calhoun County  118572
2    Alabama      Blount County   57322
3  Wisconsin    Waukesha County  389891
4  Wisconsin   Winnebago County  166994
5  Wisconsin  Washington County  131887
6    Wyoming     Natrona County   75450
7    Wyoming    Sheridan County   29116
8    Wyoming        Park County   28205

Или, если вы предпочитаете, не сбрасывайте индекс, и вывод будет:

STATE      County           
Alabama    Baldwin County       182265
           Calhoun County       118572
           Blount County         57322
Wisconsin  Waukesha County      389891
           Winnebago County     166994
           Washington County    131887
Wyoming    Natrona County        75450
           Sheridan County       29116
           Park County           28205

Спасибо за быстрый ответ и указание другого способа достижения результата!

CW Gan 10.04.2019 10:41

@CWGan рад помочь :)

Chris Adams 10.04.2019 10:42

Другие вопросы по теме