Python科学计算与数据处理-pandas

上传人:s9****2 文档编号:587439487 上传时间:2024-09-06 格式:PPT 页数:115 大小:495KB
返回 下载 相关 举报
Python科学计算与数据处理-pandas_第1页
第1页 / 共115页
Python科学计算与数据处理-pandas_第2页
第2页 / 共115页
Python科学计算与数据处理-pandas_第3页
第3页 / 共115页
Python科学计算与数据处理-pandas_第4页
第4页 / 共115页
Python科学计算与数据处理-pandas_第5页
第5页 / 共115页
点击查看更多>>
资源描述

《Python科学计算与数据处理-pandas》由会员分享,可在线阅读,更多相关《Python科学计算与数据处理-pandas(115页珍藏版)》请在金锄头文库上搜索。

1、1pandas入门目录opandas的数据结构介绍nSeriesnDataFramen索引对象o基本功能n重新索引n丢弃指定轴上的项n索引、选取和过滤n算术运算和数据对齐n函数应用和映射n排序和排名n带有重复值的轴索引2目录o汇总和计算描述统计n相关系数与协方差n唯一值、值计数以及成员资格o处理缺失数据n滤除缺失数据n填充缺失数据o层次化索引n重排分级顺序n根据级别汇总统计n使用DataFrame的列o其他有关pandas的话题34pandas含有使数据分析工作变得更快更简单的高级数据结构和操作工具。它是基于NumPy构建的,让以NumPy为中心的应用变得更加简单。因为Series和DataF

2、rame用的次数非常多,所以将其引入本地命名空间中会更方便。frompandasimportSeries,DataFrameimportpandasaspdpandas的数据结构介绍oSeriesSeries是一种类似于一维数组的对象,它由一组数据(各种NumPy数据类型)以及一组与之相关的数据标签(即索引)组成。仅由一组数据即可产生最简单的Series:5obj=Series(4,7,-5,3)obj04172-533dtype:int64pandas的数据结构介绍Series的字符串表现形式为:索引在左边,值在右边。由于没有为数据指定索引,于是会自动创建一个0到N-1(N为数据的长度)的整

3、数型索引。可以通过Series的values和index属性获取其数组表示形式和索引对象:6obj.valuesarray(4,7,-5,3,dtype=int64)obj.indexInt64Index(0,1,2,3,dtype=int64)pandas的数据结构介绍通常希望所创建的Series带有一个可以对各个数据点进行标记的索引:7obj2=Series(4,7,-5,3,index=d,b,a,c)obj2d4b7a-5c3dtype:int64obj2.indexIndex(ud,ub,ua,uc,dtype=object)pandas的数据结构介绍与普通NumPy数组相比,可以通

4、过索引的方式选取Series中的单个或一组值:8obj2a-5obj2d=6obj2c,a,dc3a-5d6dtype:int64pandas的数据结构介绍NumPy数组运算(如根据布尔型数组进行过滤、标量乘法、应用数学函数等)都会保留索引和值之间的链接:9obj2obj2obj20obj2*2np.exp(obj2)d403.428793b1096.633158a0.006738c20.085537dtype:float64pandas的数据结构介绍还可以将Series看成是一个定长的有序字典,因为它是索引值到数据值的一个映射。它可以用在许多原本需要字典参数的函数中:10binobj2Tru

5、eeinobj2Falsepandas的数据结构介绍11如果数据被存放在一个Python字典中,也可以直接通过这个字典来创建Series:sdata=Ohio:35000,Texas:71000,Oregon:16000,Utah:5000obj3=Series(sdata)obj3Ohio35000Oregon16000Texas71000Utah5000dtype:int64pandas的数据结构介绍如果只传入一个字典,则结果Series中的索引就是原字典的键(有序排列)。在例子中,sdata跟states索引相匹配的那3个值会被找出来并放到相应的位置上,但由于“California”所对

6、应的sdata值找不到,所以其结果就为NaN(即“非数字”(notanumber).12states=California,Ohio,Oregon,Texasobj4=Series(sdata,index=states)obj4CaliforniaNaNOhio35000Oregon16000Texas71000dtype:float64pandas的数据结构介绍在pandas中使用NaN表示缺失(missing)或NA值。pandas的isnull和notnull函数可用于检测缺失数据:13pd.isnull(obj4)#Series也有类似的实例方法:CaliforniaTrue#obj4

7、.isnull()OhioFalseOregonFalseTexasFalsedtype:boolpd.notnull(obj4)CaliforniaFalseOhioTrueOregonTrueTexasTruedtype:boolpandas的数据结构介绍对于许多应用而言,Series域重要的一个功能是:它在算术运算中会自动对齐不同索引的数据。14obj3obj4obj3+obj4CaliforniaNaNOhio70000Oregon32000Texas142000UtahNaNdtype:float64pandas的数据结构介绍Series对象本身及其索引都有一个name属性,该属性跟

8、pandas其他的关键功能关系非常密切:15obj4.name=populationobj4.index.name=stateobj4stateCaliforniaNaNOhio35000Oregon16000Texas71000Name:population,dtype:float64pandas的数据结构介绍16Series的索引可以通过赋值的方式就地修改:obj04172-533obj.index=Bob,Steve,Jeff,RyanobjBob4Steve7Jeff-5Ryan3dtype:int64pandas的数据结构介绍17oDataFrameDataFrame是一个表格型的数

9、据结构,它含有一组有序的列,每列可以是不同的值类型(数值、字符串、布尔值等)。DataFrame既有行索引也有列索引,它可以被看做由Series组成的字典(共用同一个索引)。跟其他类似的数据结构相比(如R的data.frame),DataFrame中面向行和面向列的操作基本上是平衡的。其实,DataFrame中的数据是以一个或多个二维块存放的(而不是列表、字典或別的一维数据结构)。pandas的数据结构介绍构建DataFrame的办法有很多,最常用的一种是直接传入一个由等长列表或NumPy数组组成的字典:结果DataFrame会自动加上索引(跟Series一样),且全部列会被有序排列.18da

10、ta=state:Ohio,Ohio,Ohio,Nevada,Nevada,year:2000,2001,2002,2001,2002,pop:1.5,1.7,3.6,2.4,2.9frame=DataFrame(data)framepandas的数据结构介绍如果指定了列序列,则DataFrame的列就会按照指定顺序迸行排列:跟Series一样,如果传入的列在数据中找不到,就会产生NA值:19DataFrame(data,columns=year,state,pop)frame2=DataFrame(data,columns=year,state,pop,debt,index=one,two,

11、three,four,five)frame2frame2.columnsIndex(uyear,ustate,upop,udebt,dtype=object)pandas的数据结构介绍通过类似字典标记的方式或属性的方式,可以将DataFrame的列获取为一个Series:20frame2stateoneOhiotwoOhiothreeOhiofourNevadafiveNevadaName:state,dtype:objectframe2.yearone2000two2001three2002four2001five2002Name:year,dtype:int64pandas的数据结构介绍注

12、意,返回的Series拥有原DataFrame相同的索引,且其name属性也已经被相应地设置好了。行也可以通过位置或名称的方式进行获取,比如用索引字段ix:21frame2.ixthreeyear2002stateOhiopop3.6debtNaNName:three,dtype:objectpandas的数据结构介绍列可以通过赋值的方式进行修改。例如,可以给那个空的“debt”列赋上一个标量值或一组值:22frame2debt=16.5frame2frame2debt=np.arange(5)frame2pandas的数据结构介绍23将列表或数组赋值给某个列时,其长度必须跟DataFrame

13、的长度相匹配。如果赋值的是一个Series,就会精确匹配DataFrame的索引,所有的空位都将被填上缺失值:val=Series(-1.2,-1.5,-1.7,index=two,four,five)frame2debt=valframe2pandas的数据结构介绍为不存在的列赋值会创建出一个新列。关键字del用于删除列:24frame2eastern=frame2.state=Ohioframe2delframe2easternframe2.columnsIndex(uyear,ustate,upop,udebt,dtype=object)pandas的数据结构介绍另一种常见的数据形式是嵌

14、套字典(也就是字典的字典):如果将它传给DataFrame,它就会被解释为:外层字典的键作为列,内层键则作为行索引:25pop=Nevada:2001:2.4,2002:2.9,Ohio:2000:1.5,2001:1.7,2002:3.6frame3=DataFrame(pop)frame3frame3.T#也可以对该结果进行转置pandas的数据结构介绍内层字典的键会被合并、排序以形成最终的索引。如果显式指定了索引,则不会这样:由Series组成的字典差不多也是一样的用法:26DataFrame(pop,index=2001,2002,2003)frame3pdata=Ohio:frame

15、3Ohio:-1,Nevada:frame3Nevada:2DataFrame(pdata)pandas的数据结构介绍27如果设置了DataFrame的index和columns的name属性,则这些信息也会被显示出来:跟Series一样,values属性也会以二维ndarray的形式返回DataFrame中的数据:frame3.index.name=year;frame3.columns.name=stateframe3frame3.valuesarray(nan,1.5,2.4,1.7,2.9,3.6)pandas的数据结构介绍28如果DataFrame各列的数据类型不同,则值数组的数据类

16、型就会选用能兼容所有列的数据类型:frame2frame2.valuesarray(2000L,Ohio,1.5,nan,2001L,Ohio,1.7,-1.2,2002L,Ohio,3.6,nan,2001L,Nevada,2.4,-1.5,2002L,Nevada,2.9,-1.7,dtype=object)pandas的数据结构介绍o索引对象pandas的索引对象负责管理轴标签和其他元数据(比如轴名称等)。构建Series或DataFrame时,所用到的任何数组或其他序列的标签都会被转换成一个Index:29obj=Series(range(3),index=a,b,c)index=ob

17、j.indexindexIndex(ua,ub,uc,dtype=object)index1:Index(ub,uc,dtype=object)pandas的数据结构介绍Index对象是不可修改的(immutable),因此用户不能对其进行修改:不可修改性非常重要,因为这样才能使Index对象在多个数据结构之间安全共享:30index1=dTypeError:Indexesdoesnotsupportmutableoperationsindex=pd.Index(np.arange(3)obj2=Series(1.5,-2.5,0,index=index)obj2.indexisindexTr

18、uepandas的数据结构介绍除了长得像数组,Index的功能也类似一个固定大小的集合:每个索引都有一些方法和属性,它们可用于设置逻辑并回答有关该索引所包含的数据的常见问题。31frame3Ohioinframe3.columnsTrue2003inframe3.indexFalsepandas的数据结构介绍。32方法说明append连接另一个Index对象,产生一个新的Indexdiff计算差集,并得到一个Indexintersection计算交集union计算并集isin计算一个指示各值是否都包含在参数集合中的布尔型数组delete删除索引i处的元素,并得到新的Indexdrop删除传入的

19、值,并得到新的Indexinsert将元素插入到索引i处,并得到新的Indexis_monotonic当各元素均大于等于前一个元素时,返回Trueis.unique当Index没有重复值时,返回Trueunique计算Index中唯一值的数组Index的方法和属性的方法和属性 #index. index.is基本功能o重新索引pandas对象的一个重要方法是reindex,其作用是创建一个适应新索引的新对象。以之前的一个简单示例来说:33obj=Series(4.5,7.2,-5.3,3.6,index=d,b,a,c)objd4.5b7.2a-5.3c3.6dtype:float64基本功能

20、34调用该Series的reindex将会根据新索引进行重排。如果某个索引值当前不存在,就引入缺失值:obj2=obj.reindex(a,b,c,d,e)obj2a-5.3b7.2c3.6d4.5eNaNobj.reindex(a,b,c,d,e,fill_value=0)Out126:a-5.3b7.2c3.6d4.5e0.0基本功能对于时间序列这样的有序数据,重新索引时可能需要做一些插值处理。method选项即可达到此目的,例如,使用ffill可以实现前向值填充:35obj3=Series(blue,purple,yellow,index=0,2,4)obj3.reindex(range

21、(6),method=ffill)0blue1blue2purple3purple4yellow5yellowdtype:object基本功能reindex的(插值)method选项对于DataFrame,reindex可以修改(行)索引、列,或两个都修改。如果仅传入一个序列,则会重新索引行:36参数说明ffill或pad前向填充(或搬运)值bfill或backfill后向填充(或搬运)值frame=DataFrame(np.arange(9).reshape(3,3),index=a,c,d,columns=Ohio,Texas,California)frameframe2=frame.re

22、index(a,b,c,d)frame2基本功能37使用columns关键字即可重新索引列:也可以同时对行和列进行重新索引,而插值则只能按行应用(即轴0):利用ix的标签索引功能,重新索引任务可以变得更简洁:states=Texas,Utah,Californiaframe.reindex(columns=states)frame.reindex(index=a,b,c,d,method=ffill,columns=states)frame.ixa,b,c,d,states基本功能reindex函数的参数38参数说明index 用作索引的新序列。既可以是index实例,也可以是其他序列型的Py

23、thon数据结构。Index会被完全使用,就像没有任何复制一样。method插值(填充)方式。fill_value在重新索引的过程中,需要引入缺失值时使用的替代值.limit前向或后向填充时的最大填充量.level 在Multiindex的指定级别上匹配简单索引,否则选取其子集copy 默认为True,无论如何都复制;如果为False,则新旧相等就不复制基本功能o丢弃指定轴上的项丢弃某条轴上的一个或多个项很简单,只要有一个索引数组或列表即可。由于需要执行一些数据整理和集合逻辑,所以drop方法返回的是一个在指定轴上删除了指定值的新对象:39obj=Series(np.arange(5,),in

24、dex=a,b,c,d,e)new_obj=obj.drop(c)new_obja0b1d3e4obj.drop(d,c)基本功能对于DataFrame,可以刪除任意轴上的索引值:40data=DataFrame(np.arange(16).reshape(4,4),index=Ohio,Colorado,Utah,NewYork,columns=one,two,three,four)data.drop(Colorado,Ohio)data.drop(two,axis=1)data.drop(two,four,axis=1)基本功能41o索引、选取和过滤Series索引(obj.)的工作方式类

25、似于NumPy数组的索引,只不过Series的索引值不只是整数。obj=Series(np.arange(4,),index=a,b,c,d)objb1obj11obj2:4c2d3dtype:int32基本功能42objb,a,db1a0d3dtype:int32obj1,3b1d3dtype:int32objobjobjb:cb1c2dtype:int32objb:c=5obja0b5c5d3基本功能对DataFrame进行索引其实就是获取一个或多个列:这种索引方式有几个特殊的情况。首先通过切片或布尔型数组选取行:44datatwoOhio1Colorado5Utah9NewYork13d

26、atathree,onedata:2datadatathree5基本功能45另一种用法是通过布尔型DataFrame(比如下面这个由标量比较运算得出的)进行索引:这段代码的目的是使DataFrame在语法上更像ndarray。datadatadatadata基本功能为了在DataFrame的行上进行标签索引,引入了专门的索引字段ix。它可以通过NumPy式的标记法以及轴标签从DataFrame中选取行和列的子集。这也是一种重新索引的简单手段:46data.ixColorado,two,threetwo5three6Name:Colorado,dtype:int32data.ixColorado

27、,Utah,3,0,1基本功能47data.ix2one8two9three10four11Name:Utah,dtype:int32data.ix:Utah,twoOhio0Colorado5Utah9Name:two,dtype:int32data.ixdata.three5,:3data.ixColorado,two,threetwo5three6Name:Colorado,dtype:int32基本功能48DataFrame的索引选项:类型说明objval选取DataFrame的单个列或一组列。在一些特殊情况下会比较便利:布尔型数组(过滤行)、切片(行切片)、布尔型DataFrame(

28、根据条件设置值)。obj.ixval选取DataFrame的单个行或一组行。obj.ix:,val选取单个列或列子集。obj.ixval1,val2同时选取行和列。reindex方法将一个或多个轴匹配到新索引。xs方法根据标签选取单行或单列,并返回一个Series。icol、irow方法根据整数位置选取单列或单行,并返回一个Series。get.value,set_value方法根据行标签和列标签选取单个值。基本功能49o算术运算和数据对齐pandas最重要的一个功能是,它可以对不同索引的对象进行算术运算。在将对象相加时,如果存在不同的索引对,则结果的索引就是该索引对的并集。s1=Series

29、(7.3,-2.5,3.4,1.5,index=a,c,d,e)s2=Series(-2.1,3.6,-1.5,4,3.1,index=a,c,e,f,g)s1s2基本功能将它们相加就会产生:自动的数据对齐操作在不重叠的索引处引入NA值。缺失值会在算术运算过程中传播。50s1+s2Out201:a5.2c1.1dNaNe0.0fNaNgNaNdtype:float64基本功能对于DataFrame,对齐操作会同时发生在行和列上:51df1=DataFrame(np.arange(9,).reshape(3,3),columns=list(bcd),index=Ohio,Texas,Colora

30、do)df2=DataFrame(np.arange(12,).reshape(4,3),columns=list(bde),index=Utah,Ohio,Texas,Oregon)df1df2df1+df2#把它们相加后将会返回一个新的DataFrame,其索引和列为原来那两个DataFrame的并集.基本功能52o在算术方法中填充值在对不同索引的对象进行算术运算时,可能希望当一个对象中某个轴标签在另一个对象中找不到时填充一个特殊值(比如0):df1=DataFrame(np.arange(12).reshape(3,4),columns=list(abcd)df2=DataFrame(n

31、p.arange(20.).reshape(4,5),columns=list(abcde)df1df2df1+df2#将它们相加时,没有重叠的位置就会产生NA值.基本功能使用df1的add方法,传入df2以及一个fill_value参数:与此类似,在对Series或DataFrame重新索引时,也可以指定一个填充值:53df1.add(df2,fill_value=0)df1.reindex(columns=df2.columns,fill_value=0)灵活的算术方法add用于加法(+)的方法sub用于减法(-)的方法div用于除法(/)的方法mul用于乘法(*)的方法基本功能oData

32、Frame和Series之间的运算跟NumPy数组一样,DataFrame和Series之间算术运算也是有明确规定的。先来看一个具有启发性的例子,计算一个二维数组与其某行之间的差:54arr=np.arange(12.).reshape(3,4)arrarray(0.,1.,2.,3.,4.,5.,6.,7.,8.,9.,10.,11.)arr0array(0.,1.,2.,3.)arr-arr0array(0.,0.,0.,0.,4.,4.,4.,4.,8.,8.,8.,8.)基本功能这就叫做广播(broadcasting)。DataFrame和Series之间的运算差不多也是如此:默认情况

33、下,DataFrame和Series之间的算术运算会将Series的索引匹配到DataFrame的列,然后沿着行一直向下广播.55frame=DataFrame(np.arange(12.).reshape(4,3),columns=list(bde),index=Utah,Ohio,Texas,Oregon)series=frame.ix0frameseriesframe-series基本功能如果某个索引值在DataFrame的列或Series的索引中找不到,则参与运算的两个对象就会被重新索引以形成并集:如果希望匹配行且在列上广播,则必须使用算术运算方法。例如:传入的轴号就是希望匹配的轴。在

34、本例中目的是匹配DateFrame的行索引并进行广播。56series2=Series(range(3),index=b,e,f)frame+series2series3=framedseries3frame.sub(series3,axis=0)基本功能57o函数应用和映射NumPy的ufuncs(元素级数组方法)也可用于操作pandas对象:frame=DataFrame(np.random.randn(4,3),columns=list(bde),index=Utah,Ohio,Texas,Oregon)framenp.abs(frame)基本功能另一个常见的操作是,将函数应用到由各列或

35、行所形成的一维数组上。DataFrame的apply方法即可实现此功能:许多最为常见的数组统计功能都被实现成DataFrame的方法(如sum和mean),因此无需使用apply方法。58f=lambdax:x.max()-x.min()frame.apply(f)frame.apply(f,axis=1)基本功能59除标量值外,传递给apply的函数还可以返回由多个值组成的Series:deff(x):returnSeries(x.min(),x.max(),index=min,max)frameframe.apply(f)基本功能60此外,元素级的Python函数也是可以用的。假如想得到f

36、rame中各个浮点值的格式化字符串,使用applymap即可:之所以叫做applymap,是因为Series有一个用于应用元素级函数的map方法:format=lambdax:%.2f%xframe.applymap(format)framee.map(format)基本功能o排序和排名根据条件对数据集排序(sorting)也是一种重要的内置运算。要对行或列索引进行排序(按字典顺序),可使用sort_index方法,它将返回一个已排序的新对象:61obj=Series(range(4),index=d,a,b,c)obj.sort_index()a1b2c3d0dtype:int64基本功能6

37、2而对于DataFrame,则可以根据任意一个轴上的索引进行排序:数据默认是按升序排序的,但也可以降序排序:frame=DataFrame(np.arange(8).reshape(2,4),index=three,one,columns=d,a,b,c)frame.sort_index()frame.sort_index(axis=1)frame.sort_index(axis=1,ascending=False)基本功能若要按值对Series进行徘序,可使用其order方法:63obj=Series(4,7,-3,2)obj.order()2-3320417obj=Series(4,np.

38、nan,1,np.nan,-3,2)obj.order()#在排序时,缺失值默认都会被放到Series的末尾.4-32152041NaN3NaN基本功能在DataFrame上,可能希望根据一个或多个列中的值进行排序。将一个或多个列的名字传递给by选项即可达到该目的:要根据多个列进行排序,传入名称的列表即可:64frame=DataFrame(b:4,7,-3,2,a:0,1,0,1)frameframe.sort_index(by=b)frame.sort_index(by=a,b)基本功能65排名(ranking)跟排序关系密切,且它会增设一个排名值(从1开始,一直到数组中有效数据的数量)。

39、它跟numpy.argsort产生的间接排序索引差不多,只不过它可以根据某种规则破坏平级关系。Series和DataFrame的rank方法:默认情况下,rank是通过“为各组分配一个平均排名”的方式破坏平级关系的:obj=Series(7,-5,7,4,2,0,4)obj071-52734425064printobj.rank()06.511.026.534.543.052.064.5基本功能66obj.rank(method=first)#根据值在原数据中出现的顺序给出排名:06112734435265obj.rank(ascending=False,method=max)#按降序进行排名

40、:02172234455664基本功能DataFrame可以在行或列上计算排名: 67排名时用于破坏平级关系的method选项Method说明average默认:在相等分组中,为各个值分配平均排名min使用整个分组的最小排名max使用整个分组的最大排名first按值在原始数据中的出现顺序分配排名frame=DataFrame(b:4.3,7,-3,2,a:0,1,0,1,c:-2,5,8,-2.5)frameframe.rank(axis=1)基本功能o带有重复值的轴索引带有重复索引值的Series:索引的is_unique属性验证是否是唯一的:68obj=Series(range(5),in

41、dex=a,a,b,b,c)obja0a1b2b3c4obj.index.is_uniqueFalse基本功能对于带有重复值的索引,数据选取的行为将会有些不同。如果某个索引对应多个值,则返回一个Series;而对应单个值的,则返回一个标量值。对DataFrame的行进行索引时也是如此:69objaa0a1objc4df=DataFrame(np.random.randn(4,3),index=a,a,b,b)dfdf.ixb汇总和计算描述统计pandas对象拥有一组常用的数学和统计方法。它们大部分都属于约简和汇总统计,用于从Series中提取的个值(如sum或mean)或从DataFrame的

42、行或列中提取一个Series。跟对应的NumPy数组方法相比,它们都是基于没有缺失数据的假设而构建的。接下来看一个简单的DataFrame:70df=DataFrame(1.4,np.nan,7.1,-4.5,np.nan,np.nan,0.75,-1.3,index=a,b,c,d,columns=one,two)df汇总和计算描述统计调用DataFrame的sum方法将会返回一个含有列小计的Series:71df.sum()one9.25two-5.80dtype:float64#传入axis=1将会按行进行求和运算:df.sum(axis=1)a1.40b2.60cNaNd-0.55dt

43、ype:float64汇总和计算描述统计NA值会自动被排除,除非整个切片(这里指的是行或列)都是NA。通过skipna选项可以禁用该功能:72df.mean(axis=1,skipna=False)aNaNb1.300cNaNd-0.275dtype:float64约简方法的选项选项说明axis约简的轴。DataFrame的行用0,列用1skipna 排除缺失值,默认值为Truelevel如果轴是层次化索引的(即Multiindex),则根据level分组约简汇总和计算描述统计有些方法(如idxmin和idxmax)返回的是间接统计(比如达到最小值或最大值的索引):还有一种方法,它既不是约简型

44、也不是累计型。describe就是一个例子,它用于一次性产生多个汇总统计:73df.idxmax()onebtwoddf.cumsum()#累计型的计算df.describe()汇总和计算描述统计对于非数值型数据,describe会产生另外一种汇总统计:74obj=Series(a,a,b,c*4)objobj.describe()count16unique3topafreq8dtype:object汇总和计算描述统计描述和汇总统计:75方法说明count非NA值的数量describe针对Series或各DataFrame列计算汇总统计min,max计算最小值和最大值argmin,argmax

45、计算能够获取到最小值和最大值的索引位置(整数)idxmin,idxmax计算能够获取到最小值和最大值的索引值quantile计算样本的分位数(0到1)sum值的总和mean值的平均数media值的算术中位数(50%分位数)mad根据平均值计算平均绝对离差var样本值的方差汇总和计算描述统计描述和汇总统计(续)76方法说明std样本值的标准差skew样本值的偏度(三阶矩)kurt样本值的峰度(四阶矩)cumsum样本值的累计和cummin,cummax样本值的累计最大值和累计最小cumprod样本值的累计积diff计算一阶差分(对时间序列很有用)pct_change计算百分数变化汇总和计算描述统

46、计o相关系数与协方差有些汇总统计(如相关系数和协方差)是通过参数对计算出来的。下面几个DataFrame数据来自Yahoo!Finance的股票价格和成交量:77importpandas.io.dataasweball_data=fortickerinAAPL,IBM,MSFT,GOOG:all_dataticker=web.get_data_yahoo(ticker,1/1/2000,1/1/2010)price=DataFrame(tic:dataAdjClosefortic,datainall_data.iteritems()volume=DataFrame(tic:dataVolume

47、fortic,datainall_data.iteritems()汇总和计算描述统计接下来计算价格的百分数变化:Series的corr方法用于计算两个Series中重叠的、非NA的、按索引对齐的值的相关系数。与此类似,cov用干计算协方差:78returns=price.pct_change()returns.tail()returns.MSFT.corr(returns.IBM)0.49597970053200319returns.MSFT.cov(returns.IBM)0.00021595764765417841汇总和计算描述统计DataFrame的corr和cov方法将以DataFra

48、me的形式返回完整的相关系数或协方差矩阵:利用DataFrame的corrwith方法,可以计算其列或行跟另一个Series或DataFrame之间的相关系数。传入一个Series将会返回一个相关系数值Series(针对各列进行计算):79returns.corr()returns.cov()returns.corrwith(returns.IBM)AAPL0.410011GOOG0.390689IBM1.000000MSFT0.495980汇总和计算描述统计传入一个DataFrame则会计算按列名配对的相关系数。下面计算了百分比变化与成交量的相关系数:传入axis=1即可按行进行计算。无论如

49、何,在计算相关系数之前,所有的数据项都会按标签对齐。80returns.corrwith(volume)AAPL-0.057549GOOG0.062647IBM-0.007892MSFT-0.014245dtype:float64汇总和计算描述统计o唯一值、值计数以及成员资格还有一类方法可以从一维Series的值中抽取信息。以下面这个Series为例:返回的唯一值是未排序的,如果需要的话,可以对结果再次进行排序(uniques.sort()。value_counts用于计算一个Series中各值出现的频率:81obj=Series(c,a,d,a,a,b,b,c,c)#函数是unique,它可

50、以得到Series中的唯一值数组:uniques=obj.unique()uniquesarray(c,a,d,b,dtype=object)汇总和计算描述统计为了便于査看,结果Series是按值频率降序排列的。value_counts还是一个顶级pandas方法,可用于任何数组或序列:82obj.value_counts()c3a3b2d1dtype:int64pd.value_counts(obj.values,sort=False)a3c3b2d1dtype:int64汇总和计算描述统计最后是isin,它用于判断矢量化集合的成员资格,可用于选取Series中或DataFrame列中数据的

51、子集:83mask=obj.isin(b,c)mask0True1False2False3False4False5True6True7True8Truedtype:boolobj0c1a2d3a4a5b6b7c8cdtype:objectobjmask0c5b6b7c8c汇总和计算描述统计唯一值、值计数、成员资格方法84方法说明isin计算一个表示“Series各值是否包含于传入的值序列中”的布尔型数组unique计算Series中的唯一值数组,按发现的顺序返回value_counts返回一个Series,其索引为唯一值,其值为频率,按计数值降序排列汇总和计算描述统计85有时,可能希望得到Da

52、taFrame中多个相关列的一张柱状图。例如:将pandas.value_counts传给该DataFrame的apply函数,就会出现:data=DataFrame(Qu1:1,3,4,3,4,Qu2:2,3,1,2,3,Qu3:1,5,2,4,4)dataresult=data.apply(pd.value_counts).fillna(0)result处理缺失数据缺失数据(missingdata)在大部分数据分析应用中都很常见。pandas的设计目标之一就是让缺失数据的处理任务尽量轻松。例如,pandas对象上的所有描述统计都排除了缺失数据。pandas使用浮点值NaN(NotaNumb

53、er)表示浮点和非浮点数组中的缺失数据。它只是一个便于被检测出来的标记而已:86string_data=Series(aardvark,artichoke,np.nan,avocado)处理缺失数据Python内置的None值也会被当做NA处理87string_data0=Nonestring_data.isnull()0True1False2True3Falsedtype:boolstring_data0aardvark1artichoke2NaN3avocadodtype:objectstring_data.isnull()0False1False2True3Falsedtype:bool

54、处理缺失数据NA处理方法:88方法说明dropna根据各标签的值中是否存在缺失数据对轴标签进行过滤,可通过阈值调节对缺失值的容忍度fillna 用指定值或插值方法(如ffill或bfill)填充缺失数据isnull返回一个含有布尔值的对象,这些布尔值表示哪些值是缺失值/NA,该对象的类型与源类型一样notnullisnull的否定式处理缺失数据o滤除缺失数据过滤掉缺失数据的办法有很多种。纯手工操作永远都是一个办法,但dropna可能会更实用一些。对于一个Series,dropna返回一个仅含非空数据和索引值的Series:89fromnumpyimportnanasNAdata=Series(

55、1,NA,3.5,NA,7)data.dropna()01.023.547.0dtype:float64处理缺失数据当然,也可以通过布尔型索引达到这个目的:对于DataFrame对象,dropna默认丢弃任何含有缺失值的行:90datadata.notnull()01.023.547.0dtype:float64data=DataFrame(1.,6.5,3.,1.,NA,NA,NA,NA,NA,NA,6.5,3.1)cleaned=data.dropna()datacleaned处理缺失数据传入how=all将只丢弃全为NA的那些行:另一个滤除DataFrame行的问题涉及时间序列数据。假设

56、只想留下一部分观测数据,可以用thresh参数实现此目的:91data.dropna(how=all)#要用这种方式丢弃列,只需传入axis=1即可:data4=NAdatadata.dropna(axis=1,how=all)df=DataFrame(np.random.randn(7,3)df.ix:4,1=NA;df.ix:2,2=NAdfdf.dropna(thresh=3)处理缺失数据o填充缺失数据若不想滤除缺失数据(有可能会丢弃跟它有关的其他数据),而是希望通过其他方式填补那些“空洞”。对于大多数情况而言,fillna方法是最主要的函数。通过一个常数调用fillna就会将缺失值替换

57、为那个常数值:若是通过一个字典调用fillna,就可以实现对不同的列填充不同的值92df.fillna(0)df.fillna(1:0.5,3:-1)处理缺失数据93fillna默认会返回新对象,但也可以对现有对象进行就地修改:对reindex有效的那些插值方法也可用于fillna:#总是返回被填允对象的引用_=df.fillna(0,inplace=True)dfdf=DataFrame(np.random.randn(6,3)df.ix2:,1=NA;df.ix4:,2=NAdfdf.fillna(method=ffill)df.fillna(method=ffill,limit=2)处理

58、缺失数据可以利用fillna实现许多别的功能。比如可以传入Series的平均值或中位数:94data=Series(1.,NA,3.5,NA,7)data.fillna(data.mean()01.00000013.83333323.50000033.83333347.000000dtype:float64处理缺失数据fillna函数的参数95参数说明value 用于填充缺失值的标量值或字典对象method插值方式。如果函数调用时未指定其他参数的话,默认为“ffill”axis待填充的轴,默认axis=0inplace修改调用者对象而不产生副本limit(对于前向和后向填充)可以连续填充的最大

59、数量层次化索引层次化索引(hierarchicalindexing)是pandas的一项重要功能,它能在一个轴上拥有多个(两个以上)索引级别。抽象点说,它使能以低维度形式处理高维度数据。先来看一个简单的例子:创建一个Series,并用一个由列表或数组组成的列表作为索引。96data=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)data层次化索引这就是带有Multilndex索引的Series的格式化输出形式。索引之间的“间隔”表示“直接使用上面的标签”:对于一个层次化索引的对象,选取数据子集的

60、操作很简单:97data.indexMultiIndex(levels=ua,ub,uc,ud,1,2,3,labels=0,0,0,1,1,1,2,2,3,3,0,1,2,0,1,2,0,1,1,2)datab1-0.93470120.09473230.659636dtype:float64datab:cb1-0.93470120.09473230.659636c1-1.26895521.925957dtype:float64层次化索引有时甚至还可以在“内层”中进行选取:98datadata:,2a-1.664588b0.094732c1.925957d-0.985724dtype:floa

61、t64data.ixb,db1-0.93470120.09473230.659636d2-0.98572430.114412dtype:float64层次化索引层次化索引在数据重塑和基于分组的操作(如透视表生成)中扮演着重要的角色。可通过其unstack方法被重新安排到一个DataFrame中:99data.unstack()#unstack的逆运览是stack:data.unstack().stack()a10.81583121.2221453-0.391358b1-0.2087102-0.2114713-1.549728c1-2.21400020.250401d21.7731213-0.1

62、03216层次化索引对于一个DataFrame,每条轴都可以有分层索引:100frame=DataFrame(np.arange(12).reshape(4,3),index=a,a,b,b,1,2,1,2,columns=Ohio,Ohio,Colorado,Green,Red,Green)frame层次化索引各层都可以有名字(可以是字符串,也可以是別的Python对象)。如果指定了名称,它们就会显示在控制台输出中(不要将索引名称跟轴标签混为一谈!):由于有了分部的列索引,因此可以轻松选取列分组:101frame.index.names=key1,key2frame.columns.name

63、s=state,colorframeframeOhio层次化索引可以单独创建Multilndex然后复用。上面那个DataFrame中的(分级的)列可以这样创建:102cl=MultiIndex.from_arrays(Ohio,Ohio,Colorado,Green,Red,Green,names=state,color)#pd.MultiIndexMultiIndex(levels=uColorado,uOhio,uGreen,uRed,labels=1,1,0,0,1,0,names=ustate,ucolor)frame1=DataFrame(np.arange(12).reshape

64、(4,3),index=a,a,b,b,1,2,1,2,columns=cl)层次化索引o重排分级顺序如需要重新调整某条轴上各级别的顺序,或根据指定级别上的值对数据进行排序。swaplevel接受两个级别编号或名称,并返回一个互换了级别的新对象(但数据不会发生变化):103frameframe.swaplevel(key1,key2)层次化索引而sortlevel则根据单个级别中的值对数据进行排序(稳定的)。交换级別时,常常也会用到sortlevel,这样最终结果就是有序的了:注意:在层次化索引的对象上,如果索引是按字典方式从外到从外到内排序(即调用sortlevel(0)或sort_inde

65、x()的结果),数据选取操作的性能要好很多。104frame.sortlevel(1)frame.swaplevel(0,1).sortlevel(0)层次化索引o根据级别汇总统计许多对DataFrame和Series的描述和汇总统计都有一个level选项,它用于指定在某条轴上求和的级别。再以上面那个DataFrame为例,可以根据行或列上的级別来进行求和,如下所示:105frame.sum(level=key2)frame.sum(level=color,axis=1)层次化索引o使用DataFrame的列人们经常想要将DataFrame的一个或多个列当做行索引来用,或者可能希望将行索引变成

66、DataFrame的列。以下面这个DataFrame为例:106frame=DataFrame(a:range(7),b:range(7,0,-1),c:one,one,one,two,two,two,two,d:0,1,2,0,1,2,3)frame层次化索引DataFrame的set_index函数会将其一个或多个列转换为行索引,创建一个新的DataFrame:默认情况下,那些列会从DataFrame中移除,但也可以将其保留下来:reset_index的功能跟set_index刚好相反,层次化索引的级别会被转移到列里面:107frame2=frame.set_index(c,d)frame

67、2frame.set_index(c,d,drop=False)frame2.reset_index()其他有关pandas的话题o整数索引操作由整数索引的pandas对象跟内置的Python数据结构(如列表和元组)在索引语义上有些不同。例如,你可能认为下面这段代码不会产生一个错误:这里,有一个含有0,1,2的索引,很难推断出用户想要什么(基于标签或位置的索引);相反,一个非整数索引,就没有这样的歧义:108ser=Series(np.arange(3.)#ser2ser2=Series(np.arange(3.),index=a,b,c)ser2-12.0其他有关pandas的话题为了保持良

68、好的一致性,如果轴索引含有索引器,那么根据整数进行数据选取的操作将总是面向标签的。这也包括用ix进行切片:109ser.ix:1#ser:10011dtype:float64其他有关pandas的话题如果你需要可靠的、不考虑索引类型的、基于位置的索引,可以使用Series的iget_value方法和DataFrame的irow和icol方法:110ser3=Series(range(3),index=-5,1,3)#ser3=Series(a,b,c,index=-5,1,3)ser3.iget_value(2)2frame=DataFrame(np.arange(6).reshape(3,2

69、),index=2,0,1)frame.irow(0)0011Name:2,dtype:int32其他有关pandas的话题o面板数据pandas有一个Panel数据结构,可以将其看做一个三维版的可以用一个由DataFrame对象组成的字典或一个三维ndarray来创建Panel对象:111importpandas.io.dataaswebpdata=pd.Panel(dict(stk,web.get_data_yahoo(stk,1/1/2009,6/1/2012)forstkinAAPL,GOOG,MSFT,DELL)其他有关pandas的话题Panel中的每一项(类似于DataFrame

70、的列)都是一个DataFrame:112pdataDimensions:4(items)x868(major_axis)x6(minor_axis)Itemsaxis:AAPLtoMSFTMajor_axisaxis:2009-01-0200:00:00to2012-06-0100:00:00Minor_axisaxis:OpentoAdjClosepdata=pdata.swapaxes(items,minor)pdataAdjClose其他有关pandas的话题基于ix的标签索引被推广到了三个维度,因此可以选取指定日期或日期范围的所有数据,如下所示:另一个用于呈现面板数据(尤其是对拟合统计

71、模型)的办法是“堆积式的”DataFrame形式:113pdata.ix:,6/1/2012,:pdata.ixAdjClose,5/22/2012:,:stacked=pdata.ix:,5/30/2012:,:.to_frame()stacked其他有关pandas的话题DataFrame有一个相应的to_panel方法,它是to_frame的逆运算:114stacked.to_panel()Dimensions:6(items)x3(major_axis)x4(minor_axis)Itemsaxis:OpentoAdjCloseMajor_axisaxis:2012-05-3000:00:00to2012-06-0100:00:00Minor_axisaxis:AAPLtoMSFT115

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 高等教育 > 其它相关文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号