我有一个巨大的市政图书馆目录数据集,包括书名,图书库,图书馆的行政区以及借出的次数。
我希望找到每个社区最受欢迎的三本书。
理想情况下,我会得到类似的结果:
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)
感谢您的帮助。
答案 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']]
如果您稍后需要调整标准,可以指定热门书籍和排序键的数量。