《利用python进行数据分析》读书笔记_第1页
《利用python进行数据分析》读书笔记_第2页
《利用python进行数据分析》读书笔记_第3页
《利用python进行数据分析》读书笔记_第4页
《利用python进行数据分析》读书笔记_第5页
已阅读5页,还剩25页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

/《利用python进行数据分析》读书笔记pandas是本书后续内容的首选库。pandas可以满足以下需求:具备按轴自动或显式数据对齐功能的数据结构。这可以防止许多由于数据未对齐以及来自不同数据源〔索引方式不同的数据而导致的常见错误。.集成时间序列功能既能处理时间序列数据也能处理非时间序列数据的数据结构数学运算和简约〔比如对某个轴求和可以根据不同的元数据〔轴编号执行灵活处理缺失数据合并及其他出现在常见数据库〔例如基于SQL的中的关系型运算1、pandas数据结构介绍两个数据结构:Series和DataFrame。Series是一种类似于以为NumPy数组的对象,它由一组数据〔各种NumPy数据类型和与之相关的一组数据标签〔即索引组成的。可以用index和values分别规定索引和值。如果不规定索引,会自动创建0到N-1索引。#-*-encoding:utf-8-*-importnumpyasnpimportpandasaspdfrompandasimportSeries,DataFrame#Series可以设置index,有点像字典,用index索引obj=Series<[1,2,3],index=['a','b','c']>#printobj['a']#也就是说,可以用字典直接创建Seriesdic=dict<key=['a','b','c'],value=[1,2,3]>dic=Series<dic>#下面注意可以利用一个字符串更新键值key1=['a','b','c','d']#注意下面的语句可以将Series对象中的值提取出来,不过要知道的字典是不能这么做提取的dic1=Series<obj,index=key1>#printdic#printdic1#isnull和notnull是用来检测缺失数据#printpd.isnull<dic1>#Series很重要的功能就是按照键值自动对齐功能dic2=Series<[10,20,30,40],index=['a','b','c','e']>#printdic1+dic2#name属性,可以起名字='s1'='key1'#Series的索引可以就地修改dic1.index=['x','y','z','w']DataFrame是一种表格型结构,含有一组有序的列,每一列可以是不同的数据类型。既有行索引,又有列索引,可以被看做由Series组成的字典〔使用共同的索引。跟其他类似的数据结构〔比如R中的data.frame,DataFrame面向行和列的操作基本是平衡的。其实,DataFrame中的数据是以一个或者多个二维块存放的〔不是列表、字典或者其他。#-*-encoding:utf-8-*-importnumpyasnpimportpandasaspdfrompandasimportSeries,DataFrame#构建DataFrame可以直接传入等长的列表或Series组成的字典#不等长会产生错误data={'a':[1,2,3],'c':[4,5,6],'b':[7,8,9]}#注意是按照列的名字进行列排序frame=DataFrame<data>#printframe#指定列之后就会按照指定的进行排序frame=DataFrame<data,columns=['a','c','b']>printframe#可以有空列,index是说行名frame1=DataFrame<data,columns=['a','b','c','d'],index=['one','two','three']>printframe1#用字典方式取列数据printframe['a']printframe.b#列数据的修改直接选出来重新赋值即可#行,可以用行名或者行数来进行选取printframe1.ix['two']#为列赋值,如果是Series,规定了index后可以精确赋值frame1['d']=Series<[100,200,300],index=['two','one','three']>printframe1#删除列用del函数delframe1['d']#警告:通过列名选出来的是Series的视图,并不是副本,可用Seriescopy方法得到副本另一种常见的结构是嵌套字典,即字典的字典,这样的结构会默认为外键为列,内列为行。#-*-encoding:utf-8-*-importnumpyasnpimportpandasaspdfrompandasimportSeries,DataFrame#内层字典的键值会被合并、排序以形成最终的索引pop={'Nevada':{2001:2.4,2002:2.9},'Ohio':{2000:1.5,2001:1.7,2002:3.6}}frame3=DataFrame<pop>#rintframe3#Dataframe也有行和列有name属性,DataFrame有value属性='year'='state'printframe3printframe3.values下面列出了DataFrame构造函数能够接受的各种数据。索引对象#-*-encoding:utf-8-*-importnumpyasnpimportpandasaspdfrompandasimportSeries,DataFrame#pandas索引对象负责管理轴标签和其他元数据,构建Series和DataFrame时,所用到的任何数组或其他序列的标签都被转换为Indexobj=Series<range<3>,index=['a','b','c']>index=obj.index#printindex#索引对象是无法修改的,这非常重要,因为这样才会使得Index对象在多个数据结构之间安全共享index1=pd.Index<np.arange<3>>obj2=Series<[1.5,-2.5,0],index=index1>printobj2.indexisindex1#除了长得像数组,Index的功能也类似一个固定大小的集合print'Ohio'inframe3.columnsprint2003inframe3.indexpandas中的Index是一个类,pandas中主要的Index对象〔什么时候用到。下面是Index的方法与属性,值得注意的是:index并不是数组。2、基本功能下面介绍基本的Series和DataFrame数据处理手段。首先是索引:#-*-encoding:utf-8-*-importnumpyasnpimportpandasaspdimportmatplotlib.pyplotaspltfrompandasimportSeries,DataFrame#Series有一个reindex函数,可以将索引重排,以致元素顺序发生变化obj=Series<[1,2,3,4],index=['a','b','c','d']>#注意这里的reindex并不改变obj的值,得到的是一个"副本"#fill_value显然是填充空的index的值#printobj.reindex<['a','c','d','b','e'],fill_value=0>#printobjobj2=Series<['red','blue'],index=[0,4]>#method=ffill,意味着前向值填充obj3=obj2.reindex<range<6>,method='ffill'>#printobj3#DataFrame的reindex可以修改行、列或者两个都改frame=DataFrame<np.arange<9>.reshape<<3,3>>,index=['a','c','d'],columns=['Ohio','Texas','California']>#只是传入一列数,是对行进行reindex,因为...frame的行参数叫index...<我这么猜的>frame2=frame.reindex<['a','b','c','d']>#printframe2#当传入原来没有的index是,当然返回的是空NaN#frame3=frame.reindex<['e']>#printframe3states=['Texas','Utah','California']#这是对行、列重排#注意:这里的method是对index也就是行进行的填充,列是不能填充的〔不管method的位置如何frame4=frame.reindex<index=['a','b','c','d'],columns=states,method='ffill'>#printframe4#使用ix的标签索引功能,重新索引变得比较简洁printframe.ix[['a','d','c','b'],states]关于ix,是DataFrame的一个方法,/pandas-docs/version/0.17.0/generated/pandas.DataFrame.ix.html。丢弃指定轴上的项#-*-encoding:utf-8-*-importnumpyasnpimportpandasaspdimportmatplotlib.pyplotaspltfrompandasimportSeries,DataFrame#drop函数可以丢弃轴上的列、行值obj=Series<np.arange<3.>,index=['a','b','c']>#原Series并不丢弃obj.drop<'b'>#printobj#注意下面,行可以随意丢弃,列需要加axis=1printframe.drop<['a']>printframe.drop<['Ohio'],axis=1>下面说索引、选取和过滤#-*-encoding:utf-8-*-importnumpyasnpimportpandasaspdimportmatplotlib.pyplotaspltfrompandasimportSeries,DataFrameobj=Series<[1,2,3,4],index=['a','b','c','d']>frame=DataFrame<np.arange<9>.reshape<<3,3>>,index=['a','c','d'],columns=['Ohio','Texas','California']>#Series切片和索引#printobj[obj<2]#注意:利用标签的切片与python的切片不同,两端都是包含的〔有道理printobj['b':'c']#对于DataFrame,列可以直接用名称printframe['Ohio']#特殊情况:通过切片和bool型索引,得到的是行<有道理>printframe[:2]printframe[frame['Ohio']!=0]#下面的方式是对frame所有元素都适用,不是行或者列,下面的得到的是numpy.ndarray类型的数据printframe[frame<5],type<frame[frame<5]>frame[frame<5]=0printframe#对于DataFrame上的标签索引,用ix进行printframe.ix[['a','d'],['Ohio','Texas']]printframe.ix[2]#注意这里默认取行#注意下面默认取行printframe.ix[frame.Ohio>0]#注意下面的逗号后面是列标printframe.ix[frame.Ohio>0,:2]下面是常用的索引选项:算术运算和数据对齐#pandas有一个重要的功能就是能够根据索引自动对齐,其中索引不重合的部分值为NaNs1=Series<[1,2,3],['a','b','c']>s2=Series<[4,5,6],['b','c','d']>#prints1+s2df1=DataFrame<np.arange<12.>.reshape<3,4>,columns=list<'abcd'>>df2=DataFrame<np.arange<20.>.reshape<4,5>,columns=list<'abcde'>>#printdf1+df2#使用add方法,并传入填充值,注意下面的fill_value函数是先对应填充再进行加和,而不是加和得到NaN之后再填充#printdf1.add<df2,fill_value=1000>#df1.reindex<columns=df2.columns,fill_value=0>除了add之外,还有其他的方法:DataFrame和Series之间的运算#下面看一下DataFrame和Series之间的计算过程arr=DataFrame<np.arange<12.>.reshape<<3,4>>,columns=list<'abcd'>>#下面的结果标明,就是按行分别相减即可,叫做broadcasting#注意:默认情况下,DataFrame和Series的计算会将Series的索引匹配到DataFrame的列,然后进行计算,再沿着行一直向下广播#注意:下面的式子中,如果写arr-arr[0]是错的,因为只有标签索引函数ix后面加数字才表示行printarr-arr.ix[0]Series2=Series<range<3>,index=list<'cdf'>>#按照规则,在不匹配的列会形成NaN值printarr+Series2#如果想匹配行且在列上广播,需要用到算术运算方法Series3=arr['d']#axis就是希望匹配的轴printarr.sub<Series3,axis=0>下面是函数应用和映射#-*-encoding:utf-8-*-importnumpyasnpimportpandasaspdimportmatplotlib.pyplotaspltfrompandasimportSeries,DataFrame#NumPy的元素级数组方法也适用于pandas对象frame=DataFrame<np.random.randn<4,3>,columns=list<'abc'>,index=['Ut','Oh','Te','Or']>printframe#下面是求绝对值:#printnp.abs<frame>#另一种常见的做法是:将一个函数应用到行或者列上,用apply方法,与R语言类似fun=lambdax:x.max<>-x.min<>#默认是应用在每一列上printframe.apply<fun>#下面是应用在列上printframe.apply<fun,axis=1>#很多统计函数根本不用apply,直接调用方法就可以了printframe.sum<>#除了标量值之外,apply函数后面还可以接返回多个值组成的的Series的函数,有没有很漂亮?deff<x>:returnSeries<[x.min<>,x.max<>],index=['min','max']>#printframe.apply<f>#元素级的python函数也是可以用的,但是要使用applymap函数format=lambdax:'%.2f'%xprintframe.applymap<format>#之所以要用applymap是因为Series有一个应用于元素级函数的map方法??#这里的map很有用printframe['b'].map<format>排序与排名#-*-encoding:utf-8-*-importnumpyasnpimportpandasaspdimportmatplotlib.pyplotaspltfrompandasimportSeries,DataFrame#用sort_index函数对行、列的索引进行排序obj=Series<range<4>,index=['d','a','b','c']>printobj.sort_index<>frame=DataFrame<np.arange<8>.reshape<<2,4>>,index=['three','one'],columns=['d','a','b','c']>#默认是对行"索引"进行排序,如果对列"索引"进行排序,axis=1即可printframe.sort_index<>printframe.sort_index<axis=1>printframe.sort_index<axis=1,ascending=False>#如果对值进行排序,用的是order函数,注意所有的缺失值会放到最后〔如果有的话printobj.order<>#numpy中的sort也可以用来排序printnp.sort<obj>#如果相对DataFrame的值进行排序,函数还是sort_index,只不过后面需要加一个参数byframe=DataFrame<{'b':[4,7,-3,2],'a':[0,1,0,1]}>printframe.sort_index<by=['a','b']>#rank函数返回从小到大排序的下标,对于平级的数,rank是通过"为各组分配一个平均排名"的方式破坏评级关系#下标从1开始obj=Series<[7,-5,7,4,2,0,4]>printobj.rank<>#而numpy中的argsort函数比较奇怪,返回的是把数据进行排序之后,按照值得顺序对应的下标,下标从0开始printnp.argsort<obj>#打印结果为:1,5,4,3,6,0,2按照这个下标顺序恰好可以得到从小打到的值,见下面printobj[np.argsort<obj>]#rank函数中有一个method选项,用来规定下标的方式printobj.rank<method='first',ascending=False>printobj.rank<method='max',ascending=False>printobj.rank<method='min',ascending=False>#对于DataFrame,rank函数默认把每一列排好并返回坐标printframe.rank<>printframe.rank<axis=1>带有重复值的轴索引#-*-encoding:utf-8-*-importnumpyasnpimportpandasaspdimportmatplotlib.pyplotaspltfrompandasimportSeries,DataFrame#虽然pandas的很多函数〔如reindex要求标签唯一,但是并不具有强制性obj=Series<range<5>,index=list<'aabbc'>>printobj#索引是否唯一用is_unique看是否唯一#对于重复值的索引,选取的话返回一个Series,唯一的索引返回一个标量printobj['a']#对于DataFrame也是如此df=DataFrame<np.random.randn<4,3>,index=list<'aabb'>>printdfprintdf.ix['b']#####自己导入数据的时候数据处理之前可以做一下index唯一性等,自己创建DataFrame注意不能这样3、汇总和计算描述统计#-*-encoding:utf-8-*-importnumpyasnpimportosimportpandasaspdfrompandasimportSeries,DataFrameimportmatplotlib.pyplotaspltimporttime#pandas对象拥有一组常用的数学和统计方法,大部分属于简约统计,用于从Series中提取一个值,或者从DataFrame中提取一列或者一行Series#注意:与NumPy数组相比,这些函数都是基于没有缺失数据的建设构建的,也就是说:这些函数会自动忽略缺失值。df=DataFrame<[[1.4,np.nan],[7.1,-4.5],[np.nan,np.nan],[0.75,-1.3]],index=list<'abcd'>,columns=['one','two']>printdf.sum<>printdf.sum<axis=1>#下面是一些函数,idxmin和idmax返回的是达到最小或者最大的索引printdf.idxmin<>printdf.idxmin<axis=1>#关于累积型的函数printdf.cumsum<>#describe函数,与R语言中的describe函数基本相同printdf.describe<>#对于非数值型的数据,看看下面的结果obj=Series<['c','a','a','b','d']*4>printobj.describe<>'''结果为:count20unique4topafreq8其中,freq是指字母出现的最高频率'''#-*-encoding:utf-8-*-importnumpyasnpimportosimportpandasaspdfrompandasimportSeries,DataFrameimportmatplotlib.pyplotaspltimporttime#下面看一下cummin函数#注意:这里的cummin函数是截止到目前为止的最小值,而不是加和以后的最小值frame=DataFrame<[[1,2,3,4],[5,6,7,8],[-10,11,12,-13]],index=list<'abc'>,columns=['one','two','three','four']>printframe.cummin<>printframe>>>onetwothreefoura1234b1234c-1023-13onetwothreefoura1234b5678c-101112-13相关系数与协方差有些汇总统计〔如相关系数和协方差是通过参数对计算出来的。这一节数据得不到?上不去网。唯一值、值计数以及成员资格#-*-encoding:utf-8-*-importnumpyasnpimportosimportpandasaspdfrompandasimportSeries,DataFrameimportmatplotlib.pyplotaspltobj=Series<['a','a','b','f','e']>uniques=obj.unique<>uniques.sort<>#记住这是就地排序#printuniques#下面进行计数统计,注意得到的是按照出现的频率降序排列#printobj.value_counts<>#value_counts还是一个顶级的pandas方法。可用于任何是数组或者序列#printobj.values#printpd.value_counts<obj.values,sort=False>#最后是isin判断矢量化集合的成员资格,可用于选取Series中或DataF列中的子集mask=obj.isin<['b','c']>printmaskprintobj[mask]data=DataFrame<{'Qu1':[1,3,4,3,4],'Qu2':[2,3,1,2,3],'Qu3':[1,5,2,4,4]}>printdataprintdata.apply<pd.value_counts>.fillna<0>上面这几个函数是真的非常实用!4、处理缺失数据#-*-encoding:utf-8-*-importnumpyasnpimportosimportpandasaspdfrompandasimportSeries,DataFrameimportmatplotlib.pyplotaspltimporttimefromnumpyimportnanasNA#pandas本来就被设计成自动忽略了缺失值、#nanNone都看做缺失值str_data=Series<['a',np.nan,'b','c']>str_data[0]=Noneprintstr_data.isnull<>printstr_data.notnull<>>>>0True1True2False3False0False1False2True3True#NumPy的数据类型中缺少真正的NA数据类型或位模式??滤除缺失数据#-*-encoding:utf-8-*-importnumpyasnpimportosimportpandasaspdfrompandasimportSeries,DataFrameimportmatplotlib.pyplotaspltimporttimefromnumpyimportnanasNAdata=Series<[1,NA,3.5,7,NA]>#注意返回的是不为NA的值的原来的索引,不是移除之后的索引#有一个函数reset_index这个函数〔方法?可以重新设置index,其中drop=True选项会丢弃原来的索引而设置新的从0开始的索引,这个方法只对DataFrame有用貌似。printdata.dropna<>#下面的结果一样printdata[data.notnull<>]data1=DataFrame<[[1,2,3],[NA,2.3,4],[NA,NA,NA]]>#注意:由于DataFrame的设定,只要有NA的行就会舍弃printdata1.dropna<>#传入how='all'则丢掉全为NA的行,这里的how的起名真的有点随心所欲了,哈哈printdata1.dropna<how='all'>#丢弃列printdata1.dropna<how='all',axis=1>#还有一个参数,threshdata2=DataFrame<np.random.randn<7,3>>data2.ix[:4,1]=NAdata2.ix[:2,2]=NA#printdata2#这里的thresh函数是选取最少non-NA值个数的行选出来printdata2.dropna<thresh=2>printdata2.dropna<thresh=4,axis=1>填充缺失数据#-*-encoding:utf-8-*-importnumpyasnpimportosimportpandasaspdfrompandasimportSeries,DataFrameimportmatplotlib.pyplotaspltimporttimefromnumpyimportnanasNA#主要用fillna方法填充NA处的值data2=DataFrame<np.random.randn<7,3>>data2.ix[:4,1]=NAdata2.ix[:2,2]=NA#fillna返回一个新对象,inplace=True可以就地填充printdata2.fillna<0>#printdata2.fillna<0,inplace=True>#printdata2#为不同的列填充要用到字典printdata2.fillna<{1:0.5,3:-1}>#对reindex有效的的那些差值方法也可适用于fillna,请向上看,或者搜索reindex即可df=DataFrame<np.random.randn<6,3>>df.ix[2:,1]=NAdf.ix[4:,2]=NAprintdf.fillna<method='ffill',limit=2>#只要稍微动动脑子,我们就可以知道向NA处可以填充均值等其他数data=Series<[1.2,NA,4,NA]>printdata.fillna<data.mean<>>fillna的参数如下:5、层次化索引层次化索引〔hierarchicalindex是pandas的重要功能,这能使在一个轴上拥有两个以上的索引级别。抽象点说,它能使你以低维度形式处理高维度。#-*-encoding:utf-8-*-importnumpyasnpimportosimportpandasaspdfrompandasimportSeries,DataFrameimportmatplotlib.pyplotaspltimporttimedata=Series<np.random.randn<10>,index=[['a','a','a','b','b','b','c','c','d','d'],[1,2,3,1,2,3,1,2,2,3]]>#printdata#下面是索引的选取方式printdata.indexprintdata['b']printdata['b':'c']printdata.ix[['b','d']]#下面是"内层"的选取方式printdata[:,2]#层次化索引在数据重塑和基于分组操作〔如透视表生成中扮演者重要的角色,比如用unstack方式重排DataFrame:printdata.unstack<>#stack是unstack的逆运算printdata.unstack<>.stack<>#对于DataFrame,每个轴都可以有分层索引frame=DataFrame<np.arange<12>.reshape<<4,3>>,index=[['a','a','b','b'],[1,2,1,2]],columns=[['Ohio','Ohio','Colorado'],['Green','Red','Green']]>#printframe#注意下面的方式:是为每一个轴规定名字,跟s=['key1','key2']s=['state','color']#printframe#printframe['Ohio']#可以单独创建MultiIndex然后复用#下面的multiindex可以这样创建,注意下面的生成方式columns=pd.MultiIndex.from_arrays<[['Ohio','Ohio','Colorado'],['Green','Red','Green']],names=['state','color']>frame1=DataFrame<np.arange<12>.reshape<<4,3>>,columns=columns>printframe1#重排顺序,调整索引级别printframe.swaplevel<'key1','key2'>#sortlevel则根据但各级别中的值对数据进行排序,通常用swaplevel是也会用到sortlevel〔很合理#注意得到的是副本,不是就地修改printframe.sortlevel<1>printframe.swaplevel<0,1>.sortlevel<0>printframe#许多对DataFrame和Series进行描述汇总的统计都有一个level选项,用于指定汇总方式printframe.sum<level='key2'>#不指定level的话,会按照列汇总出所有列名的和printframe.sum<>printframe.sum<level='color',axis=1>#-*-encoding:utf-8-*-importnumpyasnpimportosim

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论