MovieLens 1M数据集下载地址:https://grouplens.org/datasets/movielens/1m/
为方便,我已将数据集防止在csdn上,方便下载。
地址:https://download.csdn.net/download/m0_52945258/20415963?spm=1001.2014.3001.5501
read_table是一个数据读入工具,将数据读入到一个DataFrame中,例如,在本次数据处理的例子中,我们先
import pandas as pd
uname = ['user_id', 'gender', 'age', 'occupation', 'zip']
users = pd.read_table(r'ml-1m\users.dat', sep='::', header=None, names=uname,engine='python')
sep=' ':表示的是分隔符,比如说,在这个例子中,原数据集是以::来分隔的,所以我们的分隔符是'::',如果是txt文件,则我们的分隔符是制表符,‘\t’
header=None 表示txt文件的第一行不是列的名字,是数据。如果你的数据集一开始的第一列是数据名称,则不需要加这个,如果不是,则需要表示出来没有标题。
names表示这个DataFrame的标题是什么
运行结果:
如果是需要处理txt文件,具体查看博客:https://blog.csdn.net/u014453898/article/details/86601224
data=pd.merge(pd.merge(ratings,users),movies)
将多个表合并。
mean_ratings = data.pivot_table(values ='rating', index='title', columns ='gender', aggfunc='mean')
pivot_table具体用法可以查看博客:https://www.cnblogs.com/Yanjy-OnlyOne/p/11195621.html
写的超级好)
pivot_table( values=None, index=None, columns=None,aggfunc='mean')
主要的四个参数分别是values, index, columns, aggfunc
index表示索引,可以表示为标题吧(行标)
如果想要用两个索引值,就需要将索引用一个中括号阔起来,比如
df=pd.pivot_table(data,index=[' ',' '])
Values可以对需要的计算数据进行筛选
columns相当于对列进行索引、分类,和index差不多(列标)
aggfunc相当于是我们对数据聚合的操作,取平均数
具体用法请看博文:https://www.yiibai.com/pandas/python_pandas_groupby.html
主要就是通过后面的内容对数据进行分组
数据选取函数,主要用法见博文:https://www.jianshu.com/p/1115699e0674
选取符合的数据
mean_ratings = mean_ratings.loc[active_titles]
DataFrame.sort_values(by=‘##’,axis=0,ascending=True, inplace=False, na_position=‘last’)
主要用到by和ascending
by:指定列名(axis=0或’index’)或索引值(axis=1或’columns’)
ascending:是否按指定列的数组升序排列,默认为True,即升序排列
在本题中的应用
top_female_ratings=mean_ratings.sort_values(by='F',ascending=False)
之后,我们想要查看男女分歧最大的电影,所以我们需要在mean_rateings中间加入一行,表示男女分数的平均差,加入和排序方式如下:
mean_ratings['diff'] = mean_ratings['M'] - mean_ratings['F']
sort_by_diff = mean_ratings.sort_values(by='diff')
想要得到男生最喜欢的电影,则需要对这个这个进行逆向排序
print(sort_by_diff[::-1][:3])
最后,得到所以人分歧最大的电影,则
rating_std = data.groupby('title')['rating'].size()
print(rating_std)
rating_std = rating_std.loc[active_titles]
sorted_rating_std=rating_std.sort_values(ascending=False)
完整代码:
# coding=gbk
import pandas as pd
uname = ['user_id', 'gender', 'age', 'occupation', 'zip']
users = pd.read_table(r'ml-1m/users.dat', sep='::', header=None, names=uname, engine='python')
#print(users)
rnames = ['user_id', 'movie_id', 'rating', 'timestamp']
ratings = pd.read_table(r'ml-1m/ratings.dat', header=None, sep='::', names=rnames, engine='python')
mnames = ['movie_id', 'title', 'genres']
movies = pd.read_table(r'ml-1m/movies.dat', header=None, sep='::', names=mnames, engine='python')
data=pd.merge(pd.merge(ratings,users),movies)
#print(data)
#index 表示索引,values表示所要进行分析的数据, columns允许选择一个或多个列,以columns作为分组的列
mean_ratings = data.pivot_table(values ='rating', index='title', columns ='gender', aggfunc='mean')
ratings_by_title = data.groupby('title').size() #索引
active_titles = ratings_by_title.index[ratings_by_title >= 250] #找出其评论大于250 的索引
mean_ratings = mean_ratings.loc[active_titles]
#print(mean_ratings[:5])
top_female_ratings=mean_ratings.sort_values(by='F',ascending=False)
#print(top_female_ratings)
rating_std = data.groupby('title')['rating'].size()
print(rating_std)
rating_std = rating_std.loc[active_titles]
sorted_rating_std=rating_std.sort_values(ascending=False)