pandas:如何查找列中每个类别的最大n值

rob*_*roc 9 python pandas

我有一个巨大的市政图书馆目录数据集,包括书名,它所在的图书馆,图书馆的自治市镇以及借出的次数.

我想为每个社区找到最受欢迎的三本书.

理想情况下,我会得到这样的东西:

Borough    Title    Total_loans
A          Book1    35615 
A          Book2    34895
A          Book3    2548
B          Book1    6541
B          Book2    5425
Run Code Online (Sandbox Code Playgroud)

等等

这是我能够得到的最接近的,但结果数据框架没有按行政区划分,难以阅读.

import pandas as pd

df = pd.DataFrame({"borough":["A", "B", "B", "A", "A"], "title":["Book2", "Book1", "Book2", "Book2", "Book1"], "total_loans":[4, 48, 46, 78, 15]})

top_boroughs = df.groupby(['borough','title'])
top_boroughs.aggregate(sum).sort(['total_loans','title'], ascending=False)
Run Code Online (Sandbox Code Playgroud)

谢谢你的帮助.

Foo*_*Bar 11

简而言之:

df.groupby(level=[0,1]).sum().reset_index().sort_values(['borough', 'total_loans'], ascending=[1,0]).groupby('borough').head(3)
Run Code Online (Sandbox Code Playgroud)

步骤:

  • 做正确的分组和总和
  • 按行政区划和最大值排序
  • 由自治市镇分组并3先取得

这两者都优于公认的答案

  • 可读性(是的,一条长线,但你可以平分它):所有标准操作
  • 性能(标准优化操作与迭代扩大数据帧相比concat,浪费内存

我的输出(使用head(1)自测试数据以来2每组只有行数:

Out[484]: 
  borough  title  total_loans
1       A  Book2           82
2       B  Book1           48
Run Code Online (Sandbox Code Playgroud)