python pandas groupby sort rank/top n

У меня есть кадр данных, который сгруппирован по штатам и объединен с общим доходом, где сектор и имя игнорируются. Теперь я хотел бы разбить базовый набор данных, чтобы показать штат, сектор, имя и 2 лучших по доходам в определенном порядке (у меня есть индекс из предыдущего фрейма данных, в котором перечислены состояния в определенном порядке). Используя приведенный ниже пример, я хотел бы использовать свой отсортированный индекс (Кентукки, Калифорния, Нью-Йорк), в котором перечислены только два лучших результата для каждого штата (в ранее указанном порядке по доходам): Набор данных:

State       Sector   Name   Revenue
California  1        Tom    10
California  2        Harry  20
California  3        Roger  30
California  2        Jim    40
Kentucky    2        Bob    15
Kentucky    1        Roger  25
Kentucky    3        Jill   45
New York    1        Sally  50
New York    3        Harry  15

Датафрейм конечной цели:

State       Sector   Name   Revenue
Kentucky    3        Jill   45
Kentucky    1        Roger  25
California  2        Jim    40
California  3        Roger  30
New York    1        Sally  50
New York    3        Harry  15

person John    schedule 17.06.2018    source источник


Ответы (2)


Вы можете использовать groupby в сочетании с apply:

df.groupby('State').apply(lambda grp: grp.nlargest(2, 'Revenue'))

Выход:

                     Sector Name    Revenue
State       State           
California  California  2   Jim     40
            California  3   Roger   30
Kentucky    Kentucky    3   Jill    45
            Kentucky    1   Roger   25
New York    New York    1   Sally   50
            New York    3   Harry   15

Затем вы можете отбросить первый уровень MultiIndex, чтобы получить результат, который вам нужен:

df.index = df.index.droplevel()

Выход:

         Sector Name    Revenue
State           
California  2   Jim     40
California  3   Roger   30
Kentucky    3   Jill    45
Kentucky    1   Roger   25
New York    1   Sally   50
New York    3   Harry   15
person muzzyq    schedule 17.06.2018
comment
спасибо! Это здорово, самое большое значение важно, так как я буду экспортировать результат в xcel, а не в head(). В очередной раз благодарим за помощь! - person John; 17.06.2018

Вы можете sort_values затем использовать groupby + head

df.sort_values('Revenue',ascending=False).groupby('State').head(2)
Out[208]: 
        State  Sector   Name  Revenue
7     NewYork       1  Sally       50
6    Kentucky       3   Jill       45
3  California       2    Jim       40
2  California       3  Roger       30
5    Kentucky       1  Roger       25
8     NewYork       3  Harry       15
person BENY    schedule 17.06.2018