python pandas groupby sort rank / top n

时间:2018-06-17 02:03:01

标签: python pandas rank

我有一个按州分组的数据框,汇总到总收入,其中扇区和名称被忽略。我现在想要打破底层数据集,以按特定顺序按收入显示状态,扇区,名称和前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

2 个答案:

答案 0 :(得分:2)

您可以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

答案 1 :(得分: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