Joh*_*ohn 4 python rank pandas
我有一个按州分组并汇总到总收入的数据框,其中忽略了部门和名称。我现在想分解基础数据集,以按特定顺序按收入显示状态、部门、名称和前 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
Run Code Online (Sandbox Code Playgroud)
最终目标数据框:
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
Run Code Online (Sandbox Code Playgroud)
您可以将 agroupby与 结合使用apply:
df.groupby('State').apply(lambda grp: grp.nlargest(2, 'Revenue'))
Run Code Online (Sandbox Code Playgroud)
输出:
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
Run Code Online (Sandbox Code Playgroud)
然后,您可以删除 的第一级MultiIndex以获得您所追求的结果:
df.index = df.index.droplevel()
Run Code Online (Sandbox Code Playgroud)
输出:
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
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)