《利用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属性,可以起名字dic1.name='s1'dic1.index.name='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属性frame3.index.name='year'frame3.columns.name='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的一个方法,。丢弃指定轴上的项#-*-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',