导入需要用到的库
import numpy as np
import pandas as pd
1.1 读取user文件
df_user = pd.read_csv("./data/user", delimiter="|", header=None, names=["用户编号", "年龄", "性别", "职业", "邮政编码"])
df_user.head()
结果展示:
1.2 查看文件信息
df_user.info()
结果展示:
2.1 读取data文件
df_data = pd.read_csv("./data/data", sep="\t", header=None, names=["用户编号", "商品编号", "评价", "时间戳"])
df_data.head()
结果展示:
2.2 查看文件信息
df_data.info()
结果展示:
3.3 读取item文件
col_names = '电影编号 | 电影名称 | 发布日期 | 视频发布日期 | IMDb 网址 | 未知 | 行动 | 冒险 | 动画 | 儿童 | 喜剧 | 犯罪 | 纪录片 | 戏剧 | 奇幻 | 黑色电影 | 恐怖 | 音乐剧 | 谜| 浪漫 | 科幻 | 惊悚 | 战争 | 西方 '.split('|')
col_names = [col.strip() for col in col_names] # 去掉空格
df_item = pd.read_csv("./data/item", sep="|", header=None, names=col_names, encoding="ISO-8859-1")
df_item.head()
结果展示:
3.2 查看文件信息
df_item.info()
结果展示:
1.查询每个用户的平均打分
df_score_mean = df_data.groupby("用户编号")["评价"].mean()
df_score_mean.apply(lambda x:round(x,1))
结果展示:
3.查看不同职业、性别的平均打分
df_user_data = df_user.merge(df_data) # 先将user和data表连接起来
df_all = df_user_data.merge(df_item, left_on="商品编号", right_on="电影编号") # 再将user_data和item表通过两个字段连接起来
df_all.head() # 展示得到的新表df_all
结果展示:
df_all[["性别", "职业", "评价"]].groupby(by=["性别", "职业"]).mean().apply(lambda x: round(x, 1)).head()
由于数据太多只显示几行
结果展示:
4.查询电影平均分排名
df1 = df_all[["商品编号","电影名称","评价"]]
df1.groupby("商品编号").mean().sort_values("评价",ascending=False).head(10)
结果展示:
5.查询大于平均分的电影的数量
score_mean = df_all["评价"].mean() # 平均分
score_mean
df_all[df_all["评价"] > score_mean].shape[0] # 大于平均分
结果展示:
6.查询高分电影中(>3)打分次数最多的用户,并求出此人打的平均分
df_count = df_all[df_all["评价"] > 3].groupby("用户编号").count()
df_count # 先统计出评价大于3的用户次数
结果展示:
uid = df_count.sort_values("年龄",ascending=False).index[0]
uid # 取出这个用户的id
df_all[df_all["用户编号"] == uid]["评价"].mean() # 该用户的平均评价
结果展示:
7.查询每个用户的平均打分,最低打分,最高打分
df_all[["用户编号","评价"]].groupby("用户编号").agg(["mean","max","min"])
结果展示:
8.查询被评分超过100次的电影的平均分排名 TOP10
df_grp = df_all[["商品编号","评价"]].groupby("商品编号")
df_grp # 提取出字段
df_gt_100 = df_grp.count() > 100 # 评价总数大于100的
df_gt_100 = df_gt_100.reset_index() # 获取评价总数大于100的索引
df_gt_100.head() # 展示前几行
结果展示:
df_result = df_gt_100.merge(df_data,left_on="商品编号",right_on="商品编号")
df_result # df_gt_100和df_data连接起来
结果展示:
df_head10 = df_result[df_result["评价_x"] == True].groupby("商品编号")["评价_y"].mean().sort_values(ascending=False).head(10)
df_head10
结果展示: