Learning: 利用Python进行数据分析 - MovieLens 数据集的探索

MovieLens 1M数据集含有来自6000名用户对4000部电影的100万条评分数据,分为三个表,movies、ratings、users

Learning: 利用Python进行数据分析 - MovieLens 数据集的探索_第1张图片

数据处理

通过pandas.read_table将各表转化为pandas 的DataFrame对象

import pandas as pd
#用户信息
unames = ['user_id', 'gender', 'age' , 'occupation' , 'zip']
users = pd.read_table('E:/Wheat/DataAnalysis/pydata-book/pydata-book-2nd-edition/datasets/movielens/users.dat',sep= '::', header = None, names = unames,engine = 'python')
#评分
rnames = ['user_id', 'movie_id', 'rating', 'timestamp']
ratings = pd.read_table('E:/Wheat/DataAnalysis/pydata-book/pydata-book-2nd-edition/datasets/movielens/ratings.dat',sep= '::', header = None, names = rnames,engine = 'python')
#电影信息
mnames = ['movie_id', 'title' , 'genres']
movies =  pd.read_table('E:/Wheat/DataAnalysis/pydata-book/pydata-book-2nd-edition/datasets/movielens/movies.dat',sep= '::', header = None, names = mnames,engine = 'python')

其中用到的参数为分隔符sep、头文件header、列名定义names、解析器引擎engine,这里和书上相比多用了engine参数,engine参数有C和Python,C引擎速度更快,而Python引擎目前功能更完整。

利用python的切片查看每个DataFrame

#检查数据的输出
print(users[:5])
print(ratings[:5])
print(movies[:5])

结果输出如下

Learning: 利用Python进行数据分析 - MovieLens 数据集的探索_第2张图片

可通过info()查看dataframe的summary

ratings.info()

Learning: 利用Python进行数据分析 - MovieLens 数据集的探索_第3张图片

想要根据性别和年龄计算某部电影的平均得分,可用pandas.merge 将所有数据都合并到一个表中。merge有四种连接方式(默认为inner),分别为

内连接(inner),取交集;

外连接(outer),取并集,并用NaN填充;

左连接(left),左侧DataFrame取全部,右侧DataFrame取部分;

右连接(right),右侧DataFrame取全部,左侧DataFrame取部分;

data = pd.merge(pd.merge(ratings, users), movies) 
data.info()

Learning: 利用Python进行数据分析 - MovieLens 数据集的探索_第4张图片

通过索引器查看第一行数据,当使用ix索引时,虽然仍有结果输出,但提示.ix已弃用,请使用基于标签的索引.loc或基于位置的索引.iloc,因此修改为

print(data.iloc[0])

Learning: 利用Python进行数据分析 - MovieLens 数据集的探索_第5张图片


数据透视表

为了按性别计算每部电影的平均得分,可通过数据透视表(pivot_table)实现

mean_ratings = data.pivot_table('rating', index=["title"],columns=["gender"], aggfunc='mean')
print(mean_ratings[:5])
该操作产生了另一个DataFrame,输出内容为rating列的数据,行标index为电影名称,列标为性别,aggfunc参数为函数或函数列表(默认为numpy.mean),其中“columns”提供了一种额外的方法来分割数据。

Learning: 利用Python进行数据分析 - MovieLens 数据集的探索_第6张图片


过滤评分数据不够250条的电影

通过groupby()对title进行分组,并利用size()得到一个含有各电影分组大小的Series对象。

ratings_by_title = data.groupby('title').size()
print(ratings_by_title[:10])

Learning: 利用Python进行数据分析 - MovieLens 数据集的探索_第7张图片

最后通过index索引筛选出评分数据大于250条的电影名称。

active_titles = ratings_by_title.index[ratings_by_title >= 250]
print(active_titles)
Learning: 利用Python进行数据分析 - MovieLens 数据集的探索_第8张图片

使用mean_ratings选取所需的行

mean_ratings = mean_ratings.loc[active_titles]
mean_ratings.info()
print(mean_ratings[:5])


Learning: 利用Python进行数据分析 - MovieLens 数据集的探索_第9张图片


了解女性观众最喜欢的电影

通过sort_index进行降序

top_female_ratings = mean_ratings.sort_index(by = 'F',  ascending = False)
print(top_female_ratings[:10])

by参数的作用是针对特定的列进行排序(不能对行使用),ascending的作用是确定排序方式,默认为升序

Learning: 利用Python进行数据分析 - MovieLens 数据集的探索_第10张图片


计算评分分歧

增加一列存放平均得分之差,并对其排序,得到分歧最大且女性观众更喜欢的电影

mean_ratings['diff'] = mean_ratings['M'] - mean_ratings['F']
sorted_by_diff = mean_ratings.sort_index(by = 'diff')
print(sorted_by_diff[:10])

Learning: 利用Python进行数据分析 - MovieLens 数据集的探索_第11张图片

对排序结果反序可得男性观众更喜欢的电影

print(sorted_by_diff[::-1][:10])
Learning: 利用Python进行数据分析 - MovieLens 数据集的探索_第12张图片


以上为本人使用《利用Python进行数据分析》的学习过程(Python 3.6),如有理解不当的地方,望指出,感激不尽!



你可能感兴趣的:(Python,for,Data,Analysis)