Python数据分析示例(2)Day3
说明:本文章为Python数据处理学习日志,主要内容来自书本《利用Python进行数据分析》,Wes McKinney著,机械工业出版社。
电影数据分析
所需文件在Day2中下载,接下来要用到的一些文件的文件格式如下:
users.dat文件格式1::F::1::10::480672::M::56::16::700723::M::25::15::55117ratings.dat文件格式1::1193::5::9783007601::661::3::9783021091::914::3::978301968movies.dat文件格式1::Toy Story (1995)::Animation|Children's|Comedy2::Jumanji (1995)::Adventure|Children's|Fantasy3::Grumpier Old Men (1995)::Comedy|Romance
[/code]通过pandas.read_table将各个表分别读到pandas DataFrame对象中:```codeimport pandas as pdimport ospath='E:\\Enthought\\book\\ch02\\movielens'os.chdir(path) #改变当前工作目录到pathunames = ['user_id','gender','age','occupation','zip']users = pd.read_table('users.dat',sep='::',header=None,names=unames) #根据'::'分解记录-c:1: ParserWarning: Falling back to the 'python' engine because the 'c' engine does not support regex separators; you can avoid this warning by specifying engine='python'.rnames = ['user_id','movie_id','rating','timestamp']ratings = pd.read_table('ratings.dat',sep='::',header=None,names=rnames,engine='python') #加了engine='python'就不会出现上述报错mnames = ['movie_id','title','genres']movies = pd.read_table('movies.dat',sep='::',header=None,names=mnames,engine='python')
[/code]查看各个DataFrame对象:```codeusers[:5]Out[11]: user_id gender age occupation zip0 1 F 1 10 480671 2 M 56 16 700722 3 M 25 15 551173 4 M 45 7 024604 5 M 25 20 55455ratings[:5]Out[12]: user_id movie_id rating timestamp0 1 1193 5 9783007601 1 661 3 9783021092 1 914 3 9783019683 1 3408 4 9783002754 1 2355 5 978824291movies[:5]Out[13]: movie_id title genres0 1 Toy Story (1995) Animation|Children's|Comedy1 2 Jumanji (1995) Adventure|Children's|Fantasy2 3 Grumpier Old Men (1995) Comedy|Romance3 4 Waiting to Exhale (1995) Comedy|Drama4 5 Father of the Bride Part II (1995) Comedy
[/code]其中年龄age,职业occupation是以编码形式给出,具体含义参见README。
接下来尝试分析散布在三个表中的数据。假设我们想根据性别和年龄计算某部电影的平均得分,如果将所有数据合并到一个表的话问题就简单多了。我们先用pandas的merge函数将ratings跟users
**合并** 到一起,然后再将movies野合并进去。pandas会根据列明的重叠情况推断出哪些是合并(或连接)键:```codedata = pd.merge(pd.merge(ratings,users),movies)data[:5] #可能输merge策略改变,接下来两个输出结果均与书本不同Out[16]: user_id movie_id rating timestamp gender age occupation zip \0 1 1193 5 978300760 F 1 10 48067 1 2 1193 5 978298413 M 56 16 70072 2 12 1193 4 978220179 M 25 12 32793 3 15 1193 4 978199279 M 25 7 22903 4 17 1193 5 978158471 M 50 1 95350 title genres 0 One Flew Over the Cuckoo's Nest (1975) Drama 1 One Flew Over the Cuckoo's Nest (1975) Drama 2 One Flew Over the Cuckoo's Nest (1975) Drama 3 One Flew Over the Cuckoo's Nest (1975) Drama 4 One Flew Over the Cuckoo's Nest (1975) Drama data.ix[0] #输出第一条记录Out[17]: user_id 1movie_id 1193rating 5timestamp 978300760gender Fage 1occupation 10zip 48067title One Flew Over the Cuckoo's Nest (1975)genres DramaName: 0, dtype: object
[/code]接下来就可以根据任意个用户或者电影属性对评分数据进行 **聚合** 操作。按性别计算每部电影的平均分,可以使用pivot_table方法:```codemean_ratings = data.pivot_table('rating',index='title',columns='gender',aggfunc='mean') #参数改变rows-index,cols-columns,与书本不一样mean_ratings[:5]Out[26]: gender F Mtitle $1,000,000 Duck (1971) 3.375000 2.761905'Night Mother (1986) 3.388889 3.352941'Til There Was You (1997) 2.675676 2.733333'burbs, The (1989) 2.793478 2.962085...And Justice for All (1979) 3.828571 3.689024
[/code]该操作产生一个DataFrame,其内容为电影平均分,行标为电影名称,列标为性别。现在,过滤掉评分数据不够250条的电影。先对title进行分组,然后利用size()得到一个含有各电影分组大小的Series对象:```coderatings_by_title = data.groupby('title').size()ratings_by_title[:10]Out[28]: title$1,000,000 Duck (1971) 37'Night Mother (1986) 70'Til There Was You (1997) 52'burbs, The (1989) 303...And Justice for All (1979) 1991-900 (1994) 210 Things I Hate About You (1999) 700101 Dalmatians (1961) 565101 Dalmatians (1996) 36412 Angry Men (1957) 616dtype: int64active_titles = ratings_by_title.index[ratings_by_title>=250]active_titlesOut[31]: Index([u''burbs, The (1989)', u'10 Things I Hate About You (1999)',u'101 Dalmatians (1961)', u'101 Dalmatians (1996)',u'12 Angry Men (1957)', u'13th Warrior, The (1999)',u'2 Days in the Valley (1996)', u'20,000 Leagues Under the Sea (1954)',u'2001: A Space Odyssey (1968)', u'2010 (1984)',...u'X-Men (2000)', u'Year of Living Dangerously (1982)',u'Yellow Submarine (1968)', u'You've Got Mail (1998)',u'Young Frankenstein (1974)', u'Young Guns (1988)',u'Young Guns II (1990)', u'Young Sherlock Holmes (1985)',u'Zero Effect (1998)', u'eXistenZ (1999)'],dtype='object', name=u'title', length=1216)
[/code]该索引中含有评分数据大于250条的电影名称,然后就可以据此从前面的mean_ratings中 **选取** 所需的行了:```codemean_ratings = mean_ratings.ix[active_titles]mean_ratings[:5] #此处与书本不同Out[34]: gender F Mtitle 'burbs, The (1989) 2.793478 2.96208510 Things I Hate About You (1999) 3.646552 3.311966101 Dalmatians (1961) 3.791444 3.500000101 Dalmatians (1996) 3.240000 2.91121512 Angry Men (1957) 4.184397 4.328421
[/code]为了了解女性观众最喜欢的电影,可以对F列降序排列:```codetop_female_ratings = mean_ratings.sort_index(by='F',ascending=False)-c:1: FutureWarning: by argument to sort_index is deprecated, pls use .sort_values(by=...)#此处出现警告,pandas0.18.1版本sort_index没有by参数,具体见下top_female_ratings = mean_ratings.sort_values(by='F',ascending=False)top_female_ratings[:10]Out[38]: gender F Mtitle Close Shave, A (1995) 4.644444 4.473795Wrong Trousers, The (1993) 4.588235 4.478261Sunset Blvd. (a.k.a. Sunset Boulevard) (1950) 4.572650 4.464589Wallace & Gromit: The Best of Aardman Animation... 4.563107 4.385075Schindler's List (1993) 4.562602 4.491415Shawshank Redemption, The (1994) 4.539075 4.560625Grand Day Out, A (1992) 4.537879 4.293255To Kill a Mockingbird (1962) 4.536667 4.372611Creature Comforts (1990) 4.513889 4.272277Usual Suspects, The (1995) 4.513317 4.518248
[/code]警告函数比较,pandas版本0.18.1> **pandas.DataFrame.sort_index()**
> **Parameters:**
> **_axis_ ** : index, columns to direct sorting
> **_level_ ** : int or level name or list of ints or list of level names
> if not None, sort on values in specified index level(s)
> **_ascending_ ** : boolean, default True
> Sort ascending vs. descending
> **_inplace_ ** : bool, if True, perform operation in-place
> **_kind_ ** : {quicksort, mergesort, heapsort}
> Choice of sorting algorithm. See also ndarray.np.sort for more information.
> mergesort is the only stable algorithm. For DataFrames, this option is only
> applied when sorting on a single column or label.
> **_na_position_ ** : {‘first’, ‘last’}
> first puts NaNs at the beginning, last puts NaNs at the end
> **_sort_remaining_ ** : bool
> if true and sorting by level and index is multilevel, sort by other levels
> too (in order) after sorting by specified level
> **Returns:**
> **_sorted_obj_ ** : DataFrame
>
> **pandas.DataFrame.sort_values()**
> **Parameters** :
> **_by_ ** : string name or list of names which refer to the axis items
> **_axis_ ** : index, columns to direct sorting
> **_ascending_ ** : bool or list of bool
> Sort ascending vs. descending. Specify list for multiple sort orders. If
> this is a list of bools, must match the length of the by.
> **_inplace_ ** : bool
> if True, perform operation in-place
> **_kind_ ** : {quicksort, mergesort, heapsort}
> Choice of sorting algorithm. See also ndarray.np.sort for more information.
> mergesort is the only stable algorithm. For DataFrames, this option is only
> applied when sorting on a single column or label.
> **_na_position_ ** : {‘first’, ‘last’}
> first puts NaNs at the beginning, last puts NaNs at the end
> **Returns** :
> **_sorted_obj_ ** : DataFrame计算评分分歧
假设我们想要找出男性和女性观众分歧最大的电影。一个办法师给mean_ratings加上一个用于存放平均得分之差的列diff,并对其进行排序可得到分歧最大且女性观众更喜欢的电影:```codemean_ratings['diff'] = mean_ratings['M']-mean_ratings['F']sort_by_diff = mean_ratings.sort_values(by='diff')sort_by_diff[:5]Out[41]: gender F M difftitle Dirty Dancing (1987) 3.790378 2.959596 -0.830782Jumpin' Jack Flash (1986) 3.254717 2.578358 -0.676359Grease (1978) 3.975265 3.367041 -0.608224Little Women (1994) 3.870588 3.321739 -0.548849Steel Magnolias (1989) 3.901734 3.365957 -0.535777
[/code]堆排序结果反序并取前5行,得到的则是男性观众更喜爱的电影:```codesort_by_diff[::-1][:5]Out[43]: gender F M difftitle Good, The Bad and The Ugly, The (1966) 3.494949 4.221300 0.726351Kentucky Fried Movie, The (1977) 2.878788 3.555147 0.676359Dumb & Dumber (1994) 2.697987 3.336595 0.638608Longest Day, The (1962) 3.411765 4.031447 0.619682Cable Guy, The (1996) 2.250000 2.863787 0.613787
[/code]如果只想要找出分歧最大的电影(不考虑性别因素),则可以计算得分数据的方差或者标准差:```code#分组后计算标准差rating_std_by_title = data.groupby('title')['rating'].std()#筛选评分多于250条的rating_std_by_title = rating_std_by_title.ix[active_titles]rating_std_by_title.order(ascending=False)[:5]-c:1: FutureWarning: order is deprecated, use sort_values(...) #虽有警告,依然能得出结果rating_std_by_title.sort_values(ascending=False)[:5]Out[50]: titleDumb & Dumber (1994) 1.321333Blair Witch Project, The (1999) 1.316368Natural Born Killers (1994) 1.307198Tank Girl (1995) 1.277695Rocky Horror Picture Show, The (1975) 1.260177Name: rating, dtype: float64
[/code]![在这里插入图片描述](https://img-blog.csdnimg.cn/20210608151750993.gif)
Python数据分析示例(2)Day3相关推荐
- 《Python数据分析与挖掘实战》示例源码免费下载
<Python数据分析与挖掘实战> 在当今大数据驱动的时代,要想从事机器学习.人工智能.数据挖掘等前沿技术,离不开数据跟踪与分析,通过NumPy.Pandas等进行数据科学计算,通过Se ...
- python 住区数据_Python实现的北京积分落户数据分析示例
本文实例讲述了Python实现的北京积分落户数据分析.分享给大家供大家参考,具体如下: 北京积分落户状况 获取数据(爬虫/文件下载)-> 分析 (维度-指标) 从公司维度分析不同公司对落户人数指 ...
- Python数据分析三剑客学习笔记Day3——pandas包的使用:认识series类型,DataFrame类型,读取excel表格数据及数据操作
本文是视频Python数据分析三剑客 数学建模基础 numpy.pandas.matplotlib的学习笔记. -------------------------------------------- ...
- 彩民看过来,看老程序员如何用Python数据分析双色球基于线性回归算法预测下期中奖结果示例
@本文来源于公众号:csdn2299,喜欢可以关注公众号 程序员学府 本文实例讲述了Python数据分析之双色球基于线性回归算法预测下期中奖结果.分享给大家供大家参考,具体如下: 前面讲述了关于双色球 ...
- python数据分析简单实例-利用Python进行数据分析――基础示例
编辑推荐: 来源csdn ,文章通过美国官方网站的几个案例详细讲解了Python数据分析,介绍较为详细,更多内容请参阅下文. import json import numpy as np import ...
- python数据分析基础 余本国_Python数据分析基础
本书根据作者多年教学经验编写, 条理清楚, 内容深浅适中, 尽量让读者从实例出发, 结合课后练习, 少走弯路.本书涉及的内容主要包括Python数据类型与运算.流程控制及函数与类.Pandas库的数据 ...
- python代码示例图形-纯干货:手把手教你用Python做数据可视化(附代码)
原标题:纯干货:手把手教你用Python做数据可视化(附代码) 导读:制作提供信息的可视化(有时称为绘图)是数据分析中的最重要任务之一.可视化可能是探索过程的一部分,例如,帮助识别异常值或所需的数据转 ...
- 如何自学python数据分析-良心整理!学习Python数据分析的正确姿势
学习 Python 数据分析的正确姿势 如果你是通过学习给程序员设计的 Python 课程来学习 Python 数据分析,那就大错特错了.很多数据分析师在开始学习 Python 数据分析之前就被引导学 ...
- 从零开始学python数据分析-从零开始学Python数据分析与挖掘 PDF 扫描版
给大家带来的一篇关于数据挖掘相关的电子书资源,介绍了关于Python.数据分析.数据挖掘方面的内容,本书是由清华大学出版社出版,格式为PDF,资源大小67.8 MB,刘顺祥编写,目前豆瓣.亚马逊.当当 ...
最新文章
- Android MediaPlayer 和 NativePlayer 播放格式控制
- IOS , plist 配置项说明
- 韩国浦项化学在中国斥资超2800亿韩元投建电动车电池材料厂
- php ajax loading图片居中显示,PHP语言入门之PHP+ajax实现登录按钮加载loading效果
- Tensorflow官方文档学习理解 (六)-TensorFlow运作方式入门
- [C#]通过ARP获取Mac与IP的对应表
- python做什么模型_用python做模型
- 图解谷歌地球使用入门、谷歌地球COM API 开发入门、谷歌地球使用的初步协议分析
- opencv 在图片上打印字符。
- ros2 launch 用法以及一些基础功能函数的示例
- SELECT TOP 100 PERCENT * 的含义
- Typora最常用的记笔记教程
- python之pip常用命令
- unity ugui image组件ngui uisprite 对称显示功能
- 用PAM自定义身份验证
- MATLAB【函数和图像】
- C#高效编程:改进C#代码的50个行之有效的办法(第2版)(奋斗的小鸟)_PDF 电子书
- rdkitpython | 挑选多个互变异构体的主要构象
- Springboot(编程不良人)
- 概率论小课堂:伯努利实验(正确理解随机性,理解现实概率和理想概率的偏差)