《利用python进行数据分析》学习笔记(二)

处理MovieLens 1M data set

由于代码段不是很多,就将笔记和查漏补缺部分合在一起了。

导入表格数据
import pandas as pd

upath = os.path.expanduser('ch02/movielens/users.dat')
rpath = os.path.expanduser('ch02/movielens/ratings.dat')
mpath = os.path.expanduser('ch02/movielens/movies.dat')

unames = ['user_id', 'gender', 'age', 'occupation', 'zip']
rnames = ['user_id', 'movie_id', 'rating', 'timestamp']
mnames = ['movie_id', 'title', 'genres']

#方法一
users = pd.read_table(upath, sep='::', header=None, names=unames, engine='python')
ratings= pd.read_table(rpath, sep='::', header=None, names=rnames, engine='python')
movies = pd.read_table(mpath, sep='::', header=None, names=mnames, engine='python')

#方法二
users = pd.read_csv(upath, sep='::', header=None, names=unames)
ratings = pd.read_csv(rpath, sep='::', header=None, names=rnames)
movies = pd.read_csv(mpath, sep='::', header=None, names=mnames)

对于表格数据,用read_table和read_csv均可,names表示的是columns,sep是根据数据格式来确定的。

  • users数据
    这里写图片描述
  • movies数据
    这里写图片描述
  • ratings数据
    这里写图片描述
数据合并
data = pd.merge(pd.merge(ratings, users), movies)
  • data
    这里写图片描述
    运用merge 进行数据合并,pandas会根据列名的重叠情况自动进行合并,这就非常智能,免去了自己合并表格的麻烦。如果没有特殊要求,就直接pd.merge(left,right)即可。
    关于pandas.merge参数太多就不过多介绍,附上链接。
    http://pandas.pydata.org/pandas-docs/stable/merging.html
按性别计算每部电影平均得分
mean_ratings = data.pivot_table(value='rating', index='title',columns='gender', aggfunc='mean')
  • mean_ratings
    这里写图片描述

  • pandas.pivot_table

pandas.pivot_table(data, values=None, index=None, columns=None, aggfunc=’mean’, fill_value=None, margins=False, dropna=True, margins_name=’All’)

parameters

data : DataFrame

values: 需要聚合的列或者需要进行操作的列,比如代码中的**‘rating’**

index : 列 column
- 必须与data长度一致,它将构成pivot table的index,比如代码里的**‘title’**

columns : 列 column
- 必须与data长度一致,它将构成pivot table的column,比如代码里的**‘gender’**

aggfunc : function,默认为numpy.mean(), 取均值

fill_value : 标量,默认为None
- 填充缺失值

margins : 布尔量,默认为False
- 添加行或列,例如统计总数

dropna : 布尔量,默认为False
- 剔除全为NaN的列

margins_name : str,字符串,默认为’all’
- 当margins是True时,margins行或列的名称

现在回头去看那段关于pivot_table的代码就很明了了,title是我们的index,gender中存在的元素就是我们的列,这里只有F和M,所以只有两列,rating是我们pivot_table的要处理的value,最后我们经过aggfunc的处理之后得到我们要的数据,按性别计算每部电影的平均得分。下面再给出一种新方法

new_data = data[['rating','title','gender']].groupby(['title','gender'])
mean_ratings = new_data.mean().unstack()
统计每部电影评论条数并过滤掉不够250条的电影
# 方法1
ratings_by_title = data.groupby('title').size()
# 方法2
ratings_by_title = data['title'].value_counts(sort=False)

# 利用布尔索引提出评论条数多余250的电影
active_titles = ratings_by_title.index[ratings_by_title >= 250]
# 利用title索引出对应电影的mean_ratings数据
mean_ratings = mean_ratings.ix[active_titles]
# 统计最受女性欢迎的电影
top_female_ratings = mean_ratings.sort_index(by = 'F',ascending= False)
# index重命名
mean_ratings = mean_ratings.rename(index={'Seven Samurai (The Magnificent Seven) (Shichinin no samurai) (1954)':
                           'Seven Samurai (Shichinin no samurai) (1954)'})
计算评分分歧
# 添加一列用于存放平均得分之差
mean_ratings['diff'] = mean_ratings['M'] - mean_ratings['F']
# 对其排序
sorted_by_diff = mean_ratings.sort_index(by='diff')
# 对行反序,取出前15个
sorted_by_diff[::-1][:15]

# 根据电影名称分组的得分数据的标准差
rating_std_by_title = data.groupby('title')['rating'].std()
# 根据active_titles进行过滤
rating_std_by_title = rating_std_by_title.ix[active_titles]
# 根据值对Series进行降序排列
rating_std_by_title.sort_values(ascending=False)

原书中,根据值对Series排序,调用的是order()函数,我所用的python3.6所下载的pandas已经没有order函数了,已经改为sort_values().


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值