1pandas—入门目录pandas的数据结构介绍SeriesDataFrame索引对象基本功能重新索引丢弃指定轴上的项索引、选取和过滤算术运算和数据对齐函数应用和映射排序和排名带有重复值的轴索引2目录汇总和计算描述统计相关系数与协方差唯一值、值计数以及成员资格处理缺失数据滤除缺失数据填充缺失数据层次化索引重排分级顺序根据级别汇总统计使用DataFrame的列其他有关pandas的话题34pandas含有使数据分析工作变得更快更简单的高级数据结构和操作工具。它是基于NumPy构建的,让以NumPy为中心的应用变得更加简单。因为Series和DataFrame用的次数非常多,所以将其引入本地命名空间中会更方便。frompandasimportSeries,DataFrameimportpandasaspdpandas的数据结构介绍SeriesSeries是一种类似于一维数组的对象,它由一组数据(各种NumPy数据类型)以及一组与之相关的数据标签(即索引)组成。仅由一组数据即可产生最简单的Series:5obj=Series([4,7,-5,3])obj04172-533dtype:int64pandas的数据结构介绍Series的字符串表现形式为:索引在左边,值在右边。由于没有为数据指定索引,于是会自动创建一个0到N-1(N为数据的长度)的整数型索引。可以通过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([u'd',u'b',u'a',u'c'],dtype='object')pandas的数据结构介绍与普通NumPy数组相比,可以通过索引的方式选取Series中的单个或一组值:8obj2['a']-5obj2['d']=6obj2[['c','a','d']]c3a-5d6dtype:int64pandas的数据结构介绍NumPy数组运算(如根据布尔型数组进行过滤、标量乘法、应用数学函数等)都会保留索引和值之间的链接:9obj2obj2[obj20]obj2*2np.exp(obj2)d403.428793b1096.633158a0.006738c20.085537dtype:float64pandas的数据结构介绍还可以将Series看成是一个定长的有序字典,因为它是索引值到数据值的一个映射。它可以用在许多原本需要字典参数的函数中:10'b'inobj2True'e'inobj2Falsepandas的数据结构介绍11如果数据被存放在一个Python字典中,也可以直接通过这个字典来创建Series:sdata={'Ohio':35000,'Texas':71000,'Oregon':16000,'Utah':5000}obj3=Series(sdata)obj3Ohio35000Oregon16000Texas71000Utah5000dtype:int64pandas的数据结构介绍如果只传入一个字典,则结果Series中的索引就是原字典的键(有序排列)。在例子中,sdata跟states索引相匹配的那3个值会被找出来并放到相应的位置上,但由于“California”所对应的sdata值找不到,所以其结果就为NaN(即“非数字”(notanumber)).12states=['California','Ohio','Oregon','Texas']obj4=Series(sdata,index=states)obj4CaliforniaNaNOhio35000Oregon16000Texas71000dtype:float64pandas的数据结构介绍在pandas中使用NaN表示缺失(missing)或NA值。pandas的isnull和notnull函数可用于检测缺失数据:13pd.isnull(obj4)#Series也有类似的实例方法:CaliforniaTrue#obj4.isnull()OhioFalseOregonFalseTexasFalsedtype:boolpd.notnull(obj4)CaliforniaFalseOhioTrueOregonTrueTexasTruedtype:boolpandas的数据结构介绍对于许多应用而言,Series域重要的一个功能是:它在算术运算中会自动对齐不同索引的数据。14obj3obj4obj3+obj4CaliforniaNaNOhio70000Oregon32000Texas142000UtahNaNdtype:float64pandas的数据结构介绍Series对象本身及其索引都有一个name属性,该属性跟pandas其他的关键功能关系非常密切:15obj4.name='population'obj4.index.name='state'obj4stateCaliforniaNaNOhio35000Oregon16000Texas71000Name:population,dtype:float64pandas的数据结构介绍16Series的索引可以通过赋值的方式就地修改:obj04172-533obj.index=['Bob','Steve','Jeff','Ryan']objBob4Steve7Jeff-5Ryan3dtype:int64pandas的数据结构介绍17DataFrameDataFrame是一个表格型的数据结构,它含有一组有序的列,每列可以是不同的值类型(数值、字符串、布尔值等)。DataFrame既有行索引也有列索引,它可以被看做由Series组成的字典(共用同一个索引)。跟其他类似的数据结构相比(如R的data.frame),DataFrame中面向行和面向列的操作基本上是平衡的。其实,DataFrame中的数据是以一个或多个二维块存放的(而不是列表、字典或別的一维数据结构)。pandas的数据结构介绍构建DataFrame的办法有很多,最常用的一种是直接传入一个由等长列表或NumPy数组组成的字典:结果DataFrame会自动加上索引(跟Series一样),且全部列会被有序悱列.18data={'state':['Ohio','Ohio','Ohio','Nevada','Nevada'],'year':[2000,2001,2002,2001,2002],'pop':[1.5,1.7,3.6,2.4,2.9]}frame=DataFrame(data)framepandas的数据结构介绍如果指定了列序列,则DataFrame的列就会按照指定顺序迸行排列:跟Series一样,如果传入的列在数据中找不到,就会产生NA值:19DataFrame(data,columns=['year','state','pop'])frame2=DataFrame(data,columns=['year','state','pop','debt'],index=['one','two','three','four','five'])frame2frame2.columnsIndex([u'year',u'state',u'pop',u'debt'],dtype='object')pandas的数据结构介绍通过类似字典标记的方式或属性的方式,可以将DataFrame的列获取为一个Series:20frame2['state']oneOhiotwoOhiothreeOhiofourNevadafiveNevadaName:state,dtype:objectframe2.yearone2000two2001three2002four2001five2002Name:year,dtype:int64pandas的数据结构介绍注意,返冋的Series拥有原DataFrame相同的索引,且其name属性也已经被相应地设置好了。行也可以通过位置或名称的方式进行获取,比如用索引字段ix:21frame2.ix['three']year2002stateOhiopop3.6debtNaNName:three,dtype:objectpandas的数据结构介绍列可以通过赋值的方式进行修改。例如,可以给那个空的“debt”列赋上一个标量值或一组值:22frame2['debt']=16.5frame2frame2['debt']=np.arange(5)frame2pandas的数据结构介绍23将列表或数组赋值给某个列时,其长度必须跟DataFrame的长度相匹配。如果赋值的是一个Series,就会精确匹配DataFrame的索引,所有的空位都将被填上缺失值:val=Series([-1.2,-1.5,-1.7],index=['two','four','five'])frame2['debt']=valframe2pandas的数据结构介绍为不存在的列赋值会创建出一个新列。关键字del用于删除列:24frame2['eastern']=frame2.state=='Ohio'frame2delframe2['eastern']frame2.columnsIndex([u'year',u'state',u'pop',u'debt'],dtype='object‘)pandas的数据结构介绍另一种常见的数据形式是嵌套字典(也就是字典的字典):如果将它传给DataFrame,它就会被解释为:外层字典的键作为列,内层键则作为行索引:25pop={'Nevada':{2001:2.4,2002:2.9},'Ohio':{2000:1.5,2001:1.7,2002:3.6}}frame3=DataFrame(pop)frame3frame3.T#也可以对该结果进行转置pandas的数据结构介绍内层字典的键会被合并、排序以形成最终的索引。如果显式指定了索引,则不会这样:由Series组成的字典差不多也是一样的用法:26DataFrame(pop,index=[2001,2002,2003])frame3pdata={'Ohio':frame3['Ohio'][:-1],'Nevada':frame3['Nevada'][:2]}DataFrame(pdata)pandas的数据结构介绍27如果设置了DataFrame的index和columns的name属性,则这些信息也会被显示出来:跟Series一样,values属性也会以二维ndarray的形式返回DataFrame中的数据:frame3.index.name='year';frame3.columns.name='state'frame3frame3.index.name='year';frame3.columns.name='state'frame3.valuesarray([[nan,1.5],[2.4,1.7],[2.9,3.6]])pandas的数据结构介绍28如果DataFrame各列的数据类型