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

来源:互联网 发布:手机上网数据自动关闭 编辑:程序博客网 时间:2024/05/01 05:28

处理MovieLens 1M data set

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

导入表格数据

import pandas as pdupath = 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()
  • mean_ratings
    这里写图片描述
    可以发现结果基本一样除了多了一个rating标签,这说明pivot其实就是对数据进行新组合,新索引,然后调用函数,再unstack()的过程的集合。
    http://pandas.pydata.org/pandas-docs/stable/generated/pandas.pivot_table.html

统计每部电影评论条数并过滤掉不够250条的电影

# 方法1ratings_by_title = data.groupby('title').size()# 方法2ratings_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)'})
  • pandas.DataFrame.sort_index()
    http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.sort_index.html

计算评分分歧

# 添加一列用于存放平均得分之差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().

阅读全文
0 0
原创粉丝点击