3 再处理
3.1 数据集整合
movie_ratings = pd.merge(movies, ratings) lens = pd.merge(movie_ratings, users)
3.2 列出被评价过次数最多的20部电影
按照电影标题将数据集分为不同的groups,并且用size( )函数得到每部电影的个数(即每部电影被评论的次数),按照从大到小排序,取最大的前20部电影列出如下
most_rated = lens.groupby('title').size().sort_values(ascending=False)[:20] print(most_rated)
3.2 列出被评价过次数最多的20部电影
按照电影标题将数据集分为不同的groups,并且用size( )函数得到每部电影的个数(即每部电影被评论的次数),按照从大到小排序,取最大的前20部电影列出如下
most_rated = lens.groupby('title').size().sort_values(ascending=False)[:20] print(most_rated)
3.3 评分最高的十部电影
按照电影名称分组,用agg函数通过一个字典{‘rating’: [np.size, np.mean]}来按照key即rating这一列聚合,查看每一部电影被评论过的次数和被打的平均分。取出至少被评论过100次的电影按照平均评分从大到小排序,取最大的10部电影。
movie_stats = lens.groupby('title').agg({'rating': [np.size, np.mean]}) atleast_100 = movie_stats['rating']['size'] >= 100 print(movie_stats[atleast_100].sort_values([('rating', 'mean')], ascending=False)[:10])
3.4 查看不同年龄见争议最大的电影
- 查看用户的年龄分布:
users.age.plot.hist(bins=30) plt.title("Distribution of users' ages") plt.ylabel('count of users') plt.xlabel('age');
- 用pandas.cut函数将用户年龄分组
labels = ['0-9', '10-19', '20-29', '30-39', '40-49', '50-59', '60-69', '70-79'] lens['age_group'] = pd.cut(lens.age, range(0, 81, 10), right=False, labels=labels) lens[['age', 'age_group']].drop_duplicates()[:10]
- 每个年龄段用户评分人数和打分偏好,看起来年轻人更挑剔一点点
lens.groupby('age_group').agg({'rating': [np.size, np.mean]})
- 查看被评价过最多次的50部电影在不同年龄段之间的打分差异。并且用unstack函数将数据转换为一个表格,每一行为电影名称,每一列为年龄组,值为该年龄组的用户对该电影的平均评分。
3.5 不同性别间争议最大的电影
lens.reset_index(inplace=True) pivoted = lens.pivot_table(index=['movieId', 'title'], columns=['gender'], values='rating', fill_value=0) pivoted['diff'] = pivoted.M - pivoted.F print(pivoted.head())
pivoted.reset_index('movieId', inplace=True) disagreements = pivoted[pivoted.movieId.isin(most_50.index)]['diff'] disagreements.sort_values().plot(kind='barh', figsize=[9, 15]) plt.title('Male vs. Female Avg. Ratings\n(Difference > 0 = Favored by Men)') plt.ylabel('Title') plt.xlabel('Average Rating Difference') plt.show()