天天看点

利用 Python 分析 MovieLens 1M 数据集(三)2 Python 数据处理

2 Python 数据处理

2.1 转化DataFrame对象

通过[pandas.read_csv]将各表转化为pandas 的DataFrame对象

# 用户信息
unames = ['user_id', 'gender', 'age', 'occupation', 'zip']
users = pd.read_csv('/Volumes/doc/PyCharmProjects/MovieLenData/users.dat',
                    sep=',', header=None, names=unames, engine='python')
# 评分
rnames = ['user_id', 'movieId', 'rating', 'timestamp']
ratings = pd.read_csv('/Volumes/doc/PyCharmProjects/MovieLenData/ratings.csv',
                      sep=',', header=None, names=rnames, engine='python')
# 电影信息
mnames = ['movie_id', 'title', 'genres']
movies = pd.read_csv('/Volumes/doc/PyCharmProjects/MovieLenData/movies.csv',
                     sep=',', header=None, names=mnames, engine='python')

# 链接信息
lnames = ['movieId', 'imdbId', 'tmdbId']
links = pd.read_csv('/Volumes/doc/PyCharmProjects/MovieLenData/links.csv',
                    sep=',', header=None, names=mnames, engine='python')

# 标签信息
tnames = ['userId', 'movieId', 'tag', 'timestamp']
tags = pd.read_csv('/Volumes/doc/PyCharmProjects/MovieLenData/tags.csv',
                   sep=',', header=None, names=mnames, engine='python')
      

其中用到的参数为分隔符sep、头文件header、列名定义names、解析器引擎engine

这里和书上相比多用了engine参数,engine参数有C和Python,C引擎速度更快,而Python引擎目前功能更完整。

  • 利用python的切片查看每个DataFrame
## 2.2  检查数据的输出
print(users[:5])
print("===================================================================")
print(ratings[:5])
print("===================================================================")
print(movies[:5])
print("===================================================================")
print(links[:5])
print("===================================================================")
print(tags[:5])
print("===================================================================")
      
  • 查看dataframe的summary
users.info()
print("-----------------------------------")
ratings.info()
print("-----------------------------------")
movies.info()
print("-----------------------------------")
links.info()
print("-----------------------------------")
tags.info()
      

2.3 根据性别和年龄计算某部电影的平均得分

可用pandas.merge 将所有数据都合并到一个表中。merge有四种连接方式(默认为inner),分别为

  • 内连接(inner),取交集;
  • 外连接(outer),取并集,并用NaN填充;
  • 左连接(left),左侧DataFrame取全部,右侧DataFrame取部分;
  • 右连接(right),右侧DataFrame取全部,左侧DataFrame取部分;
data = pd.merge(pd.merge(ratings, users), movies)
data.info()
      
利用 Python 分析 MovieLens 1M 数据集(三)2 Python 数据处理

通过索引器查看第一行数据,使用基于标签的索引.loc或基于位置的索引.iloc

利用 Python 分析 MovieLens 1M 数据集(三)2 Python 数据处理

2.4 按性别计算每部电影的平均得分

可通过数据透视表(

pivot_table

)实现

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

利用 Python 分析 MovieLens 1M 数据集(三)2 Python 数据处理

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

  • 通过groupby()对title进行分组
  • 利用size()得到一个含有各电影分组大小的Series对象
print("过滤评分数据不够250条的电影")
ratings_by_title = data.groupby('title').size()
print(ratings_by_title[:10])
      
利用 Python 分析 MovieLens 1M 数据集(三)2 Python 数据处理
  • 最后通过index索引筛选出评分数据大于250条的电影名称
print("通过index索引筛选出评分数据大于250条的电影名称")
active_titles = ratings_by_title.index[ratings_by_title >= 250]
print(active_titles)
      
利用 Python 分析 MovieLens 1M 数据集(三)2 Python 数据处理
  • 使用mean_ratings选取所需的行
mean_ratings = mean_ratings.loc[active_titles]
mean_ratings.info()
print(mean_ratings[:5])
      
利用 Python 分析 MovieLens 1M 数据集(三)2 Python 数据处理

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

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

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

利用 Python 分析 MovieLens 1M 数据集(三)2 Python 数据处理

2.7 计算评分分歧

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

mean_ratings['diff'] = mean_ratings['M'] - mean_ratings['F']
sorted_by_diff = mean_ratings.sort_index(by='diff')
print(sorted_by_diff[:10])
      
利用 Python 分析 MovieLens 1M 数据集(三)2 Python 数据处理

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

利用 Python 分析 MovieLens 1M 数据集(三)2 Python 数据处理