Python Pandas 分组排序 排名/前n

5

我有一个按州分组并聚合到总收入的数据框,其中部门和名称被忽略。现在,我想将基础数据集拆分以显示州、部门、名称和按一定顺序排列的前两个收入(我已经从先前的数据框中创建了一个索引,按照某种顺序列出了各州)。使用下面的示例,我想使用我的排序索引(肯塔基州、加利福尼亚州、纽约州),按照收入排名每个州仅列出前两个结果(按照之前声明的收入顺序):

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
2个回答

7
你可以使用groupbyapply一起使用:
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

1
谢谢!这很棒,nlargest很重要,因为我将把结果导出到Excel,而不是head()。再次感谢您的帮助! - John

6
您可以使用 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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接