任务一:找出最多人想读的50本书的名称
任务二:找出这50本书对应最热门的10个标签
已有数据:
文件1:to_read.csv
每行两个数据,用户id和该用户想读的书籍id
文件2:books.csv
书籍的各类id,名称,作者等信息
文件3:tags.csv
每行两个数据,标签id和标签名称
文件4:book_tags.csv
每行三个数据,goodreads_book_id(和to_read中的书籍id的对应关系可以在books.csv里找到),标签id,标记次数。
思路:
任务一用文件1和文件2就能提供充分的信息了。
我们先用文件1用.value_count()来进行统计每本书的期待用户数,然后用sort_values()进行排序后切片(([:50]))前50。注意这个时候我们得到的是一个Series,我们需要提取其中的index中(id号)和value(count值,其实是非必须的,只不过是一个依据)来生成一个多列的DataFrame数据帧作为一张基础表,这个表中的id是主键。然后我们需要通过主键关联到其他表上来对应找出id对应的书名(title)。我们发现在文件2中有书名信息,但是文件2中的内容太多了,我们需要简化以保证信息的间接性,所以我们可以从文件二中用DataFrame的读取方法读取其中我们需要的列生成一张id和书名对应的书名表(books_id_and_title),然后通过主键和刚才生成的基础表做一个merge操作就可以了。注意我们这里用了on='book_id’参数设定了主键,how='left’设定了取值范围。
实现的代码如下:
import pandas as pd
to_read = pd.read_csv('to_read.csv')
to_read_counts_series = to_read['book_id'].value_counts().sort_values(ascending=False)
hottest_50_books_id_series = to_read_counts_series[:50]
print(hottest_50_books_id_series)
hottest_50_books_id_col = hottest_50_books_id_series.index
hottest_50_books_counts = hottest_50_books_id_series.values
print(hottest_50_books_id_col)
print(hottest_50_books_counts)
to_read_counts_df = pd.DataFrame({
'book_id':hottest_50_books_id_col,
'counts':hottest_50_books_counts
})
print(to_read_counts_df)
books = pd.read_csv('books.csv',encoding="ISO-8859-1")
books_id_and_title = books[['book_id','goodreads_book_id','title']]
print(books_id_and_title)
hottest_books_list = pd.merge(to_read_counts_df,books_id_and_title,on ='book_id',how='left')
hottest_books_list.to_csv('hottest_50_books.csv')
print(hottest_books_list)
最后的输出结果如下:
book_id ... title
0 47 ... The Book Thief
1 143 ...