在Movielens 1M數據集中共三個表:評分、用戶信息、電影信息,讀取數據后將數據加載到一個 pandas DataFrame中
import pandas as pd
path=r'D:\pydata-book-2nd-edition\datasets\movielens\users.dat'
user_column=['user_id','gender','age','occupation','zip']
user=pd.read_table(path,sep='::',header=None,names=user_column)#sep指的是分隔符為‘::’
path1=r'D:\pydata-book-2nd-edition\datasets\movielens\ratings.dat'
rating_column=['user_id','movie_id','rating','timestamp']
rating=pd.read_table(path1,sep='::',header=None,names=rating_column)
path2=r'D:\pydata-book-2nd-edition\datasets\movielens\movies.dat'
movie_column=['movie_id','title','genres']
movies=pd.read_table(path2,sep='::',header=None,names=movie_column,encoding='ISO-88
(1)考察pd.merge()的用法
data1=pd.merge(user,rating)#user,rating合并,自動識別相同列,笛卡爾乘積式合并,user中user_id=1,rating中user_id=3000,則合并表有1×3000個user_id
##默認inner 不匹配的直接舍棄
data1
data=pd.merge(data1,movies)
(2)pivot_table用法
#按照性別分級的電影平均得分
meaning_ratings=data.pivot_table('rating',index='title',columns='gender',aggfunc='mean')
#為排除極端情況,少于250個電影評分的數據要刪除
#先對電影評分數量進行排序得到一個Series
rating_by_title=data.groupby('title').size()
#獲取滿足條件的
active_titles=rating_by_title.index[rating_by_title>=250]#對值進行篩選
meaning_ratings=meaning_rating.loc[active_titles]
(3)根據性別進行排序
#獲取女性觀眾的top電影,按照F列進行排列
top_female_ratings=meaning_ratings.sort_values(by='F',ascending=False)
(4)兩列之差
mean_ratings['diff']=mean_ratings['M']-mean_ratings['F']
sort_by_diff=mean_ratings.sort_values(by='diff')
(5)標準差或者方差的使用
#根據標題分組獲得評分異議最大的電影
rating_std_by_title=data.groupby('title')['rating'].std()
rating_std_by_title=rating_std_by_title.loc[active_titles]
rating_std_by_title.sort_values(ascending=False)[:10]
總結:這一節收獲最大的是pd.merge()的使用,排序和分組計數是對上一節的回顧和復習。