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

时间:2014-07-30 17:52:44

标签: python pandas

我有一个巨大的市政图书馆目录数据集,包括书名,图书库,图书馆的行政区以及借出的次数。

我希望找到每个社区最受欢迎的三本书。

理想情况下,我会得到类似的结果:

Borough    Title    Total_loans
A          Book1    35615 
A          Book2    34895
A          Book3    2548
B          Book1    6541
B          Book2    5425

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

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)

感谢您的帮助。

3 个答案:

答案 0 :(得分:10)

简而言之:

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

步骤:

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

由于两者都优于接受的答案

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

我的输出(使用head(1),因为测试数据每组只有2行:

Out[484]: 
  borough  title  total_loans
1       A  Book2           82
2       B  Book1           48

答案 1 :(得分:2)

类似的东西:

t = df.groupby(['borough', 'title']).sum()
t.sort('total_loans', ascending=True)
t = t.groupby(level=[0,1]).head(3).reset_index()
t.sort(['borough', 'title'], ascending=(True, False)) #not sure if this is necessary, tough to tell with limited data, but just in case...

答案 2 :(得分:0)

'''
Created on Jul 30, 2014

class TopX():



    def __init__(self, top,sortFunction):
        self.topX=top
        self.sortFunction=sortFunction
        self.data=[]


    def addNewItem(self,item):
        self.data.append(item)
        self.data.sort( key=self.sortFunction,reverse=True)
        self.data=self.data[:self.topX]
    def getMax(self):
        return self.data



def runMe():
    top = TopX(3, lambda x:int(x[2]))
    with open("lib.txt","r") as f:
        string= f.readlines()
        for line in string:
            data= [x.strip() for x in line.split(' ')]
            top.addNewItem(data)

    print top.getMax()    


if __name__ == '__main__':
    runMe()

使用格式为

的输入文件
A Book1 1
A Book2 10
A Book3 3
B Book1 7
B Book2 5

给出结果:

[['A', 'Book2', '10'], ['B', 'Book1', '7'], ['B', 'Book2', '5']]

如果您稍后需要调整标准,可以指定热门书籍和排序键的数量。