利用python进行数据分析——第二章 引言(1):利用pandas对MovieLens数据集简单处理

使用的模块

本部分主要使用的是pandas模块对数据进行分析、处理。

MovieLens数据集

MovieLens数据集是关于带你赢评分的数据,数据来自书本提供网站,这里附上我使用数据的网址:https://grouplens.org/datasets/movielens/。 在页面内找到MovieLens 1M Dataset标题下的ml-1m.zip压缩包文件,点击下载。下载的数据包括README、movies.dat、ratings.dat和users.dat四个文件。用到的数据文件是电影信息(movies.dat)、评分信息(ratings.dat)和用户信息(users.dat)三个dat格式的文件。
在这里插入图片描述
文件可以通过记事本打开进行预览,可以看到内容是通过“::”符号分隔的数据。
在这里插入图片描述

Movielens数据集处理

首先将数据读入:

# coding=gbk
import pandas as pd    #导入pandas模块
unames=["user_id","gender","age","occupation","zip"]    #给用户信息文件定义属性,包括用户id、性别、年龄、职业等
rnames=["user_id","movie_id","rating","timestamp"]    #打分属性
mnames=['movie_id','title','genres']     #电影属性:电影id、电影名、分类
rnames=['user_id','movie_id','rating','timestamp']     #评分属性
users=pd.read_table("C:/Users/GuanLi/Desktop/ML_1M/users.dat",sep="::",
header=None,names=unames)       #读取用户信息文件
movies=pd.read_table("C:/Users/GuanLi/Desktop/ML_1M/movies.dat",sep="::",
header=None,names=mnames)      #读取电影信息文件
ratings=pd.read_table("C:/Users/GuanLi/Desktop/ML_1M/ratings.dat",sep="::",
header=None,names=rnames)      #读取评分文件

可以通过输出读入数据的前五条记录进行查看一下导入数据的格式。

print("输出前五条用户信息:")
print(users[:5])
print("输出前五条电影信息:")
print(movies[:5])
print("输出前五条评分信息:")
print(ratings[:5])

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
如果需要将用户信息与用户评分信息、电影信息合并,可以通过pandas的merge函数实现:

#将users、ratings、movies合并
data=pd.merge(pd.merge(ratings,users),movies)
print(data[:5])  #输出前五条记录

pandas会根据列名的重叠情况推断出来哪些列是合并(连接)键,这里user_id是连接键。
在这里插入图片描述
在对数据进行简单的组合处理之后,可以通过pandas模块的一些函数对数据进行分析操作。首先使用pivot_table方法按性别计算每一部电影的平均得分。

#按性别计算每部电影的平均得分
mean_ratings_gender=data.pivot_table("rating",index="title",columns="gender",
aggfunc="mean")
print(mean_ratings_gender[:5])       #输出前五条记录

在这里插入图片描述
上述处理得到了另一个DataFrame(pandas的一种数据类型),内容是不同性别下电影的平均得分,行标为电影名称。为了保证平均评分的有效性和一般性,接下来过滤掉用户评分不够180(任取的数字,仅作练习)条的电影。先对title进行分组,然后利用size()得到一个含各电影分组大小的Series(pandas的另一种数据类型)对象。

ratings_by_title=data.groupby("title").size()     #将数据按照被评论次数分组
print(ratings_by_title[:10])     #输出前十条记录

在这里插入图片描述
过滤掉评论不足180条的电影记录,并计算均值得分:

#过滤掉评分数据不够180条的电影
active_titles=ratings_by_title.index[ratings_by_title>=180]
print(active_titles[:10])
mean_ratings=mean_ratings_gender.ix[active_titles]   #计算评论数据大于180条的电影根据性别得到的平均得分
print(mean_ratings[:10])
#根据女性评分对电影进行倒序排列
top_female_ratings=mean_ratings.sort_index(by="F",ascending=False)
print(top_female_ratings[:10])    #得到女性评分前十的电影

在这里插入图片描述
在这里插入图片描述
有时候性别不同喜欢的电影类型不同,那么通过计算评分分歧找出男、女观众分歧最大的电影。

mean_ratings_gender['diff']=mean_ratings_gender['M']-mean_ratings_gender['F']  #利用男性评分减去女性评分,得到差值
sorted_by_diff=mean_ratings_gender.sort_index(by='diff')  #进行排序
print(sorted_by_diff[:10])

在这里插入图片描述
如果只是想找出分歧最大的电影,不考虑性别因素,那么可以计算得分数据的方差或标准差。

rating_std_by_title=data.groupby('title')['rating'].std()    #根据电影名称分组的得分数据标准差
print(rating_std_by_title[:5])    #输出前五条记录
rating_std=rating_std_by_title.ix[active_titles]      #根据active_titles进行过滤
print(rating_std.sort_values(ascending=False)[:5])      #输出前五条记录

在这里插入图片描述
降序排列后输出前五条记录:
在这里插入图片描述
pandas除了以上函数和功能以外还可以查看数据的维度、查找数据中的空值并进行替换(补空值)以及其他一些数据处理功能。后续通过另一数据集babynames进行学习。

猜你喜欢

转载自blog.csdn.net/qq_40392850/article/details/86632161