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()
通過索引器檢視第一行資料,使用基于标簽的索引.loc或基于位置的索引.iloc
2.4 按性别計算每部電影的平均得分
可通過資料透視表(
pivot_table)實作
該操作産生了另一個DataFrame,輸出内容為rating列的資料,行标index為電影名稱,列标為性别,aggfunc參數為函數或函數清單(預設為numpy.mean),其中“columns”提供了一種額外的方法來分割資料。
2.5 過濾評分資料不夠250條的電影
- 通過groupby()對title進行分組
- 利用size()得到一個含有各電影分組大小的Series對象
print("過濾評分資料不夠250條的電影")
ratings_by_title = data.groupby('title').size()
print(ratings_by_title[:10])
- 最後通過index索引篩選出評分資料大于250條的電影名稱
print("通過index索引篩選出評分資料大于250條的電影名稱")
active_titles = ratings_by_title.index[ratings_by_title >= 250]
print(active_titles)
- 使用mean_ratings選取所需的行
mean_ratings = mean_ratings.loc[active_titles]
mean_ratings.info()
print(mean_ratings[:5])
2.6 了解女性觀衆最喜歡的電影
- 通過 sort_index 進行降序
top_female_ratings = mean_ratings.sort_index(by='F', ascending=False)
print(top_female_ratings[:10])
by參數的作用是針對特定的列進行排序(不能對行使用),ascending的作用是确定排序方式,預設為升序
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])
對排序結果反序可得男性觀衆更喜歡的電影