利用Python进行数据分析 笔记4

本文介绍 MovieLens1M 数据集,包含6000名用户对4000部电影的100万条评分数据。文章演示如何使用 pandas 处理数据,并根据性别和年龄计算电影平均得分。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

MovieLens 1M数据集

GroupLens Research采集了一组从20世纪90年末到21世纪初由MovieLens用户提供的电影评分数据。这些数据中包括电影评分、电影元数据(风格类型和年代)以及关于用户的人口统计学数据(年龄、邮编、性别和职业等)。基于机器学习算法的推荐系统一般都会对此类数据感兴趣。

MovieLens 1M数据集含有来自6000名用户对4000部电影的100万条评分数据。它分为三个表:评分、用户信息和电影信息。将该数据从zip文件中解压出来之后,可以通过pandas.read_table将各个表分别读到一个pandas DataFrame对象中:

import pandas as pd
unames=['user_id','gender','age','occupation','zip']
users=pd.read_table('G:/python/pydata-book-master/ch02/movielens/users.dat',sep='::',header=None,names=unames)
rnames=['user_id','movie_id','rating','timestamp']
ratings=pd.read_table('G:/python/pydata-book-master/ch02/movielens/ratings.dat',sep='::',header=None,names=rnames)
mnames=['movie_id','title','genres']
movies=pd.read_table('G:/python/pydata-book-master/ch02/movielens/movies.dat',sep='::',header=None,names=mnames)

利用Python的切片语法,通过查看每个DataFrame的前几行即可验证数据加载工作是否一切顺利:

users[:5]
print ratings

 

<class 'pandas.core.frame.DataFrame'>

Int64Index: 1000209 entries, 0 to 1000208

Data columns:

user_id      1000209  non-null values

movie_id     1000209  non-null values

rating       1000209  non-null values

timestamp    1000209  non-null values

dtypes: int64(4)

 

注意,其中的年龄和职业是以编码形式给出的。分析散布在三个表中的数据可不是一件轻松的事情。假设我们想要根据性别和年龄计算某部电影的平均得分,如果将所有数据合并到一个表中的话问题就简单了。可以先用pandasmerge函数将ratingsusers合并到一起,然后再将movies也合并进去。Pandas会根据列名的重叠情况推断出哪些列是合并或链接键:

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

 

<class 'pandas.core.frame.DataFrame'>

Int64Index: 1000209 entries, 0 to 1000208

Data columns:

user_id       1000209  non-null values

movie_id      1000209  non-null values

rating        1000209  non-null values

timestamp     1000209  non-null values

gender        1000209  non-null values

age           1000209  non-null values

occupation    1000209  non-null values

zip           1000209  non-null values

title         1000209  non-null values

genres        1000209  non-null values

dtypes: int64(6), object(4)

 

print data.ix[0]

user_id                                 1

movie_id                                1

rating                                  5

timestamp                       978824268

gender                                  F

age                                     1

occupation                             10

zip                                 48067

title                    Toy Story (1995)

genres        Animation|Children's|Comedy

Name: 0

 

现在,熟悉一下pandas,就能轻松地根据任意用户或电影属性对评分数据进行聚合操作了,为了按性别计算每部电影的平均得分,可以使用pivot_table方法:

mean_ratings=data.pivot_table('rating',rows='title',cols='gender',aggfunc='mean')
mean_ratings[:5]

该操作会产生另一个DataFrame,其内容为电影平均得分,行标为电影名称,列标为性别。现在,可以尝试过滤掉评分数据不够250条的电影。为了达到这个目的,先对title进行分组,然后利用size()得到一个含有各电影分组大小的Series对象:

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

active_titles=ratings_by_title.index[ratings_by_title>=250]
active_titles

该索引中含有评分数据大于250条的电影名称,然后就可以据此从前面的mean_ratings中选取所需的行了:

mean_ratings=mean_ratings.ix[active_titles]
mean_ratings

 

为了了解女性观众最喜欢的电影,可以对F列降序排列:

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

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值