《Python程序设计基础》 课件第10章实战项目之 Pandas 和Matplotlib_第1页
《Python程序设计基础》 课件第10章实战项目之 Pandas 和Matplotlib_第2页
《Python程序设计基础》 课件第10章实战项目之 Pandas 和Matplotlib_第3页
《Python程序设计基础》 课件第10章实战项目之 Pandas 和Matplotlib_第4页
《Python程序设计基础》 课件第10章实战项目之 Pandas 和Matplotlib_第5页
已阅读5页,还剩130页未读 继续免费阅读

下载本文档

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

文档简介

第10章

实战项目之Pandas和

MatplotlibPandas入门Pandas运算Pandas读写数据Pandas和Matplotlib绘图目录Pandas运算10.210.1Pandas入门10.3Pandas读写数据Pandas和Matplotlib绘图10.4知识架构10.1Pandas入门1Pandas安装2Series和DataFrame对象3索引对象4学生实践练习10.1Pandas入门1Pandas安装1.使用PyCharm工具进行安装

依次单击菜单中的“File”→“Settings…”打开PyCharm的设置界面,单击设置界面的“Project工程名”(此处为“Projectchapter10”)下的“ProjectInterpreter”菜单,单击“+”按钮添加Pandas库,如图10.1Pandas入门1Pandas安装

打开命令行工具,执行“pipinstallpandas”命令安装Pandas库,如图2.使用pip命令安装10.1Pandas入门2Series和DataFrame对象1.Series对象

Series是一种类似于一维数组的对象,它由一组数据及一组与之相关的数据标签(索引)组成。可以由一组数据产生最简单的Series,也可以带有一个对各个数据点进行标记的索引。Series对象创建的语法如下:frompandasimportSeries#导入Pandas模块中的Series类Series对象名=Series(列表)#最简单的SeriesSeries对象名=Series(列表,index=索引的列表)#带有标记的索引

如果没有为数据指定索引,会自动创建一个0到N−1(N为数据的长度)的整数型索引,这时可以通过Series的values和index属性获取其数组的表示形式和索引对象。10.1Pandas入门2Series和DataFrame对象示例10.1

分别使用两种方式创建Series对象,并输出该对象及它的数组的表示形式和索引对象。frompandasimportSeriesobj1=Series([5,8,7])#最简单的Series对象obj2=Series([5,8,7],index=["a","b","c"])#带有对各个数据标记的索引print(obj1)print(obj2)print("Series的值为:",obj1.values)print("Series的索引对象为:",obj1.index)10.1Pandas入门2Series和DataFrame对象示例10.1的结果,如图10.3所示。10.1Pandas入门2Series和DataFrame对象示例10.2根据Series对象的特性实现Series对象的各项操作。frompandasimportSeriesobj=Series([8,6,-5,2],index=["a","b","c","d"])定义Series对象如下:

(1)Series对象可以通过索引的方式选取Series中的单个或一组值,代码如下:print("1.选取Series中的单个或一组值")print(obj["a"])#输出8print(obj["d"])#输出2print(obj[["a","c","d"]])#选取索引为"a","c","d"对应的值10.1Pandas入门2Series和DataFrame对象print("2.进行NumPy数组运算")print(obj[obj>0])#获取值大于0的数据print(obj*2)#输出Series对象中每个数据乘2之后的结果(3)将Series看成是一个定长的有序字典,因为它是一个索引值到数据值的一个映射,代码如下:print("3.将Series看成是一个定长的有序字典")print("a"inobj)#判断obj对象中是否存在索引值为"a"的数据dict={"a":23,"b":12,"c":8}#定义字典对象obj2=Series(dict)#将dict对象转化为Series对象(2)对Series对象进行NumPy数组运算,如根据布尔型数组进行过滤、标量乘法或应用数学函数等都会保留索引和值之间的连接,代码如下:10.1Pandas入门2Series和DataFrame对象print("4.isnull()方法检测缺失数据")obj.isnull()#检测缺失数据(5)在算术运算中会自动对齐不同索引的数据,代码如下:print("5.自动对齐不同索引的数据")obj2=Series([8,6,-5],index=["a","b","e"])#再定义一个Series对象print(obj+obj2)#输出两个Series对象的和(4)如果Series的值中出现NaN(NotaNumber:非数字),在Pandas模块中提供了isnull()函数和notnull()函数用于检测缺失数据,Series对象也提供了isnull()方法检测缺失数据,代码如下:10.1Pandas入门2Series和DataFrame对象print("6.Series对象本身及其索引都有一个name属性")="population"#给obj对象本身的name属性赋值="state"#给obj对象的索引的name属性赋值print(obj)(7)Series的索引可以通过赋值的方式修改。如果对象中有4个数据,索引赋值时也必须保证索引中有4个元素,代码如下:print("7.Series的索引可以通过赋值的方式修改")obj.index=["f","g","k","m"]print(obj)(6)Series对象本身及其索引都有一个name属性,该属性跟Pandas其他的关键功能关系非常密切,代码如下:10.1Pandas入门2Series和DataFrame对象代码及运行结果如图10.1Pandas入门2Series和DataFrame对象2.DataFrame对象

DataFrame是一种类似电子表格的数据结构,一个DataFrame表示一个表格。它包含一个经过排序的列表集,列表集中的每个数据都可以有不同的类型值(数字、字符串、布尔等)。DataFrame有行和列的索引;它可以被看作是一个Series的字典(每个Series共享一个索引)1)创建DataFrame对象

有很多方法来构建一个DataFrame,但最常用的是用一个相等长度列表的字典或NumPy数组来构建,产生的DataFrame和Series一样,它的索引会自动分配,并且对列进行了排序。10.1Pandas入门2Series和DataFrame对象示例10.3在IDLE工具中创建DataFrame对象。#导入Pandas模块中的Series和DataFrame对象frompandasimportSeries,DataFramedata={"name":["yahoo","google","facebook"],"marks":[200,400,800],

"price":[9,3,7]}frame=DataFrame(data)#将相等长度列表的字典对象转化为DataFrame对象print(frame)#自定义DataFrame索引frame2=DataFrame(data,columns=['name','price','marks','debt'],

index=['a','b','c'])print(frame2)10.1Pandas入门2Series和DataFrame对象在IDLE工具中执行创建DataFrame对象代码,运行结果如图10.1Pandas入门2Series和DataFrame对象

在DataFrame对象中使用columns属性获取所有的列,能显示所有列的名称。在示例10.3中添加如下代码:2)DataFrame对象中列的操作print(frame2.columns)使用columns属性获取所有列的运行结果如图10.1Pandas入门2Series和DataFrame对象另外,DataFrame对象能用类似字典的方式,得到某竖列的全部内容,且每列实际上是一个Series对象,因此可以将DataFrame理解成是由一个一个的Series组成的。结合Series对象的特性,可以统一给frame2对象的debt列赋值,在示例10.3中添加如下代码frame2['debt']=89.2print(frame2)frame2对象的列赋值的运行结果如图10.1Pandas入门2Series和DataFrame对象DataFrame对象的每竖列都是一个Series对象,因此可以定义一个Series对象,将Series对象赋值给DataFrame对象中的某一列,在示例10.3中添加如下代码:debt=Series([2.2,3.3],index=["a","c"])frame2["debt"]=debtprint(frame2)Series对象赋值给DataFrame对象中的某一列的运行结果如图10.1Pandas入门2Series和DataFrame对象DataFrame对象的values属性与Series对象类似,会以二维ndarray的形式返回DataFrame中的数据,如果DataFrame各列的数据类型不同,则值数组的数据类型就会选用能兼容所有列的数据类型。例如,现有data1和data2两个数组,均转化为DataFrame对象,其values的数据类型会有所不同,在示例10.3的基础上修改代码如下:3)values属性data1={"num1":[200,400,800],"num2":[60,300,50]}data2={"name":["yahoo","google","facebook"],"marks":[200,400,800],"price":[9,3,7]}frame1=DataFrame(data1)frame2=DataFrame(data2)print(frame1.values)print(frame2.values)10.1Pandas入门2Series和DataFrame对象values属性的运行结果如图10.1Pandas入门3索引对象示例10.4在IDLE工具中创建DataFrame对象。frompandasimportSeriesobj=Series(range(3),index=['a','b','c'])index=obj.index#获取Series的索引对象print(index)#获取第二位及之后的元素print(index[1:])

Pandas的索引对象负责管理轴标签和其他元数据,如轴名称等。构建Series或DataFrame时,所用到的任何数组或其他序列的标签都会被转换成一个Index索引对象。查看索引对象应使用index属性。10.1Pandas入门3索引对象查看索引对象,如图10.1Pandas入门3索引对象索引对象是不可修改的,对索引对象进行修改将会出现如图10.11所示的异常信息。这样能使Index对象在多个数据结构之间安全共享。例如,在示例10.4中修改索引对象,添加如下代码:index[1]='d'修改索引对象的报错如图10.1Pandas入门3索引对象表10.1中列出了Pandas库中内置的Index类,Index甚至可以被继承从而实现特别的轴索引功能。10.1Pandas入门3索引对象1.Series和DataFrame的索引1)Series对象的索引Series对象的索引值不仅可以是整数,还可以是字符串,代码如下:frompandasimportSeriesimportnumpyasnpobj=Series(np.arange(4),index=['a','b','c','d'])#索引为整数print(obj[1])print(obj[2:4])#索引为字符串print(obj['b'])print(obj[['a','d']])10.1Pandas入门3索引对象Series对象使用整数或字符串作为索引值,如图10.1Pandas入门3索引对象另外,可以设置特定索引对应的值,例如,设置索引为'b'到'c'的值为5,添加代码如下:obj['b':'c']=5print(obj)设置索引为'b'到'c'的值为5,如图10.1Pandas入门3索引对象2)DataFrame对象的索引对DataFrame对象进行索引,可以获取一个或多个列,代码如下:frompandasimportDataFrameimportnumpyasnpframe=DataFrame(np.arange(9).reshape(3,3),index=['a','c','d'],columns=['Ohio','Texas','California'])print(frame)print(frame['Ohio'])#获取一列print(frame[['Texas','California']])#获取多列10.1Pandas入门3索引对象对DataFrame进行索引,如图10.1Pandas入门3索引对象DataFrame对象的索引使用方式,需要注意以下3种情况:(1)通过切片或布尔型数组选取行,在上述代码中添加如下代码:#切片选取print(frame[:2])#布尔型数组:选取索引为‘California’中值大于3的记录print(frame[frame['California']>3])通过切片或布尔型数组选取行,如图10.1Pandas入门3索引对象(2)通过布尔型DataFrame进行索引,在上述代码中添加如下代码:#布尔型DataFrame索引print(frame<5)#判断元素是否小于5frame[frame<5]=0#设置frame中值小于5的元素均为0print(frame)通过布尔型DataFrame进行索引,如图10.1Pandas入门3索引对象(3)在DataFrame的行上进行标签索引,引入了专门的索引字段loc和iloc,其中loc通过行标签索引数据,而iloc通过行号索引行数据。例如,从DataFrame中选取行和列的子集,在上述代码中添加如下代码:print("原DataFrame对象数据为:\n",frame)#标签索引#loc通过行标签索引数据,iloc通过行号索引行数据print(frame.loc[['a','d'],['Texas']])print(frame.iloc[[0,1],[0,1]])从DataFrame中选取行和列的子集,如图10.1Pandas入门3索引对象2.重新索引Pandas对象的一个重要的方法是reindex,其作用是创建一个适应新索引的新对象。1)Series对象重新索引调用Series的reindex将会根据新索引进行重排。如果某个索引值当前不存在,就引入缺失值。frompandasimportSeriesobj=Series([4.5,7.2,-6.5,4],index=['d','b','a','c'])#重新索引obj2=obj.reindex(['a','b','c','d','e'])print(obj2)print(obj.reindex(['a','b','c','d','e'],fill_value=0))#fill_value引入缺失值,设置为0示例10.510.1Pandas入门3索引对象对Series对象重新索引的运行结果如图10.1Pandas入门3索引对象对于时间序列这样的有序数据,重新索引时可以使用method参数实现插值处理,例如,使用ffill或pad可以实现前向填充值,使用bfill或backfill可以实现后向填充值。设置method参数的值为ffill的结果,在示例10.5中添加代码如下:#重新索引并设置method参数为ffill,实现前向填充值obj3=Series(['blue','purple','yellow'],index=[0,2,4])print(obj3.reindex(range(6),method='ffill'))设置method参数的值为ffill的运行结果如图10.1Pandas入门3索引对象2)DataFrame对象重新索引调用DataFrame对象中的reindex方法可以修改索引(行)、列或两个都修改,如果仅传入一个序列,则会重新索引行。调用DataFrame对象中reindex方法的结果,编写如下代码:frompandasimportDataFrameimportnumpyasnpframe=DataFrame(np.arange(9).reshape(3,3),index=['a','c','d'],columns=['Ohio','Texas','California'])print(frame)#DataFrame对象重新索引frame2=frame.reindex(['a','b','c','d'])print(frame2)10.1Pandas入门3索引对象调用DataFrame对象中reindex方法的运行结果如图10.1Pandas入门3索引对象另外,使用columns关键字可以重新索引列,添加代码如下:#使用columns关键字重新索引列states=['texas','utal','California']print(frame.reindex(columns=states))使用columns关键字重新索引列的运行结果如图所示。也可以同时对行和列进行重新索引,而插值则只能按行应用。10.1Pandas入门3索引对象3.删除指定索引的值删除某条轴上的一个或多个项很简单,只要指定索引即可,drop方法返回的是一个在指定轴上删除指定值后的新对象。例如,在示例10.5中删除索引为a和c的行记录,代码如下:frompandasimportDataFrameimportnumpyasnpframe=DataFrame(np.arange(9).reshape(3,3),index=['a','c','d'],columns=['Ohio','Texas','California'])print(frame)#删除索引为a和c的行记录new_obj=frame.drop(['a','c'])print(new_obj)10.1Pandas入门3索引对象删除多个项的运行结果如图10.1Pandas入门4学生实践练习

定义两个字典对象,分别为wordDicts1={"人民":3,"群众":2,"公平":4,"正义":6},wordDicts2={"司法":2,"社会":2}。分别将这两个字典对象转化为Series对象。输出Series对象的索引,将两个索引合并成一个新的索引对象,将第一个Series对象的索引对象替换为新的索引对象并输出该Series对象的前面三个元素。2.实现思路(1)通过“Series(字典对象)”语句将字典对象转化为Series对象。(2)使用“Series对象.index”语句获取Series对象的索引对象。(3)使用索引对象中的union方法将两个索引对象进行合并。(4)使用Series对象中的reindex方法对该对象进行重新索引。(5)使用“Series对象[上标:下标]”语句截取Series对象中的元素。1.需求说明知识架构10.2Pandas运算1算术运算3汇总统计5处理缺失数据2排序4其他运算方法6学生实践练习10.2Pandas运算1算术运算1.相同类型对象的算术运算Pandas可以对不同索引的相同对象进行算术运算,例如,在将对象相加时,如果存在不同的索引对,则结果的索引就是该索引对的并集,例如,将简单的两个Series对象进行相加,代码如下:frompandasimportSeriess1=Series([7.2,-6.5,3.5,1.6],index=['a','c','d','e'])s2=Series([-2,3,4,5,8],index=['a','c','e','f','g'])print(s1+s2)不同索引对象相加的运行结果如图10.2Pandas运算1算术运算在不重叠的索引处引入NaN值,从而实现自动的数据对齐,缺失值会在算术运算过程中传播。对于DataFrame,对齐操作会同时发生在行和列上。例如,两个DataFrame对象相加操作,代码如下:frompandasimportDataFrameimportnumpyasnpdf1=DataFrame(np.arange(9).reshape(3,3),columns=list('bcd'),index=['Ohio','Texas','Colorado'])df2=DataFrame(np.arange(12).reshape(4,3),columns=list('bde'),index=['Oregon','Ohio','Texas','Colorado'])print(df1)print(df2)#两个DataFrame对象相加操作print(df1+df2)10.2Pandas运算1算术运算DataFrame对象相加的运行结果如图10.2Pandas运算1算术运算从上面的例子可以看出,没有重叠的位置就会产生NaN值。使用DataFrame提供的add方法,传入另一个DataFrame对象及一个fill_value参数,添加代码如下:#设置产生NaN值的位置为0print(df1.add(df2,fill_value=0))使用DataFrame对象的add方法的运行结果如图10.2Pandas运算1算术运算DataFrame和Series之间的算术运算会将Series的索引匹配到DataFrame的列,然后沿着行一直向下传播。DataFrame和Series之间的算术运算操作的代码如下:frompandasimportSeries,DataFrameimportnumpyasnpframe=DataFrame(np.arange(9).reshape(3,3),columns=list('bcd'),index=['Ohio','Texas','Colorado'])series=frame.iloc[0]print("DataFrame对象为:\n",frame)print("series对象为:\n",series)print("两者相减结果为:\n",frame-series)2.不同类型对象的算术运算10.2Pandas运算1算术运算DataFrame和Series之间的算术运算的运行结果如图10.2Pandas运算1算术运算如果某个索引值在DataFrame的列或Series的索引中找不到,则参与运算的两个对象就会被重新索引以形成并集,例如,在上述代码中添加语句:series2=Series(range(3),index=['b','e','f'])print("两者相加结果为:\n",frame+series2)索引值不存在时的运行结果如图10.2Pandas运算1算术运算如果需要匹配行在列上传播,则必须使用算术运算方法,例如,在上述代码中添加语句:series3=frame['d']print("series对象为:\n",series3)print("DataFrame对象为:\n",frame)#算术运算print("算术运算后:\n",frame.sub(series3,axis=0))10.2Pandas运算1算术运算使用算术运算方法的运行结果如图10.2Pandas运算2

排序根据条件对数据集进行排序也是一种重要的内置运算,要对行或列索引进行排序,使用sort_index方法将返回一个已排序的新对象序列对象.sort_index(axis=0,level=None,ascending=True,

inplace=False,kind='quicksort',na_position

='last',sort_remaining=True,by=None)10.2Pandas运算2

排序在上述语法中,参数说明如下。(1)axis:0按照行名排序;1按照列名排序。(2)level:默认None,否则按照给定的level顺序排列。(3)ascending:默认True升序排列;False降序排列。(4)inplace:默认False,否则排序之后的数据直接替换原来的数据框。(5)kind:排序方法,其值为{'quicksort','mergesort','heapsort'},默认为'quicksort'。(6)na_position:其值为{'first',last'}缺失值,默认排在最后即'last'。10.2Pandas运算2

排序(7)sort_remaining:其值为True或False,默认为Ture。如果其值为True,且是多层索引,则在指定级别排序后,也在其他级别(按顺序)排序。(8)by:按照某一列或几列数据进行排序,但是by参数不建议使用。例如,对Series对象的排序代码如下:frompandasimportSeriesimportnumpyasnpobj=Series(np.arange(4),index=['d','a','b','c'])#使用sort_index方法将返回一个已排序的新对象print(obj.sort_index())10.2Pandas运算2

排序Series对象的排序的运行结果如图10.2Pandas运算2

排序DataFrame也可以根据任意一个轴上的索引进行排序。数据默认是升序排序的,但也可以降序排序。sort_index()方法的使用代码如下:frompandasimportDataFrameimportnumpyasnpframe=DataFrame(np.arange(9).reshape(3,3),index=['c','a','d'],columns=[4,6,5])print("DataFrame对象为:\n",frame)print("默认排序(按照行名排序):\n",frame.sort_index())print("按照列名排序:\n",frame.sort_index(axis=1))print("按照列名降序排列:\n",frame.sort_index(axis=1,ascending=False))10.2Pandas运算2

排序sort_index()方法的使用的运行结果如图10.2Pandas运算2

排序在排序时,任何缺失值默认都会被放到Series的末尾。在DataFrame上,可以根据一个或多个列中的值进行排序,将一个或多个列的名字传递给by选项即可达到该目的,代码如下:frompandasimportDataFrameframe=DataFrame({'b':[4,-3,7,2],'a':[1,6,5,3]})print("DataFrame对象为:\n",frame)print("对“b”列进行升序排列:\n",frame.sort_values(by='b'))print("对'a'和'b'两列同时进行升序排列:\n",frame.sort_values(by=['a','b']))10.2Pandas运算2

排序根据一个或多个列中的值进行排序的运行结果如图10.2Pandas运算2

排序排名跟排序关系密切,它会增设一个排名值(从1开始,一直到数组中有效数据的数量),接下来介绍Series和DataFrame的rank方法。默认情况下,rank是通过“为各组分配一个平均排名”的方式来破坏平级关系的。rank方法的使用代码如下:frompandasimportSeriesobj=Series([7,-2,4,3,12])print("序列为:\n",obj.rank())print("根据值在原数据中出现的顺序给出排名:\n",obj.rank(method="first"))10.2Pandas运算2

排序rank方法的使用效果如图10.2Pandas运算3汇总统计Pandas对象拥有一组常用的数学统计方法,例如,使用sum方法按列或按行求和的操作,代码如下:frompandasimportSeries,DataFrameimportnumpyasnpframe=DataFrame({"b":[4,-3,7,np.nan],"a":[1,6,5,3]})print("按列进行求和运算:\n",frame.sum())print("按行进行求和运算:\n",frame.sum(axis=1))10.2Pandas运算3汇总统计使用sum方法按列或按行求和的运行结果如图10.2Pandas运算4其他运算方法1.唯一值还有一类方法可以从一维Series的值中抽取信息。第一个函数是unique,它可以得到Series对象中的唯一值数组。unique函数的使用代码如下:frompandasimportSeries,DataFrameobj=Series(['a','c','a','c','b','a','d','d'])#获取Series中的唯一值数组uniques=obj.unique()print(uniques)10.2Pandas运算4其他运算方法unique函数的使用效果如图10.35所示。其中返回的唯一值是未排序的,如果有需要,我们还可以对结果使用sort方法再次进行排序。10.2Pandas运算4其他运算方法2.值计数value_counts方法用于计算一个Series中各值出现的频率,同时提供了isin方法用于计算一个表示“Series各值是否包含于传入的值序列中”的布尔型数组。例如,value_counts方法和isin方法的使用,代码如下:frompandasimportSeries,DataFrameobj=Series(['a','c','a','c','b','a','d','d'])#获取Series中的唯一值数组uniques=obj.unique()print("原序列为:\n",uniques)uniques.sort()print("排序后:\n",uniques)print("统计频率:\n",obj.value_counts())mask=obj.isin(['b','c'])print("检测值是否存在:\n",mask)print("输出与检测值对应存在的序列元素:\n",obj[mask])10.2Pandas运算4其他运算方法value_counts方法和isin方法的使用效果如图10.2Pandas运算5处理缺失数据缺失数据在大部分数据分析应用中都很常见,Pandas的设计目标之一就是让缺失数据的处理任务尽量轻松。Pandas使用浮点值NaN(NotaNumber)表示浮点和非浮点数组中的缺失数据。它只是一个便于被检测处理的标记而已。使用isnull函数判断是否为空对象,代码如下:frompandasimportSeriesimportnumpyasnpdata=Series(['a',np.nan,'c','d'])print("原序列为:\n",data)#判断是否为空对象print("判断是否为空:\n",data.isnull())10.2Pandas运算5处理缺失数据使用isnull函数判断是否为空对象的运行结果如图10.37所示。10.2Pandas运算5处理缺失数据缺失数据的处理方法见表10.3。10.2Pandas运算5处理缺失数据使用dropna()方法过滤Series和DataFrame中的缺失数据,代码如下:frompandasimportSeries,DataFramefromnumpyimportnanasNAdata=Series([1,NA,3,NA,7])print("过滤缺失数据:\n",data.dropna())print("通过布尔类型索引过滤数据:\n",data[data.notnull()])data=DataFrame([[1,6,5],[2,NA,NA]])cdata=data.dropna()print("过滤DataFrame对象的缺失数据:\n",cdata)10.2Pandas运算5处理缺失数据使用dropna()方法过滤Series和DataFrame中的缺失数据,运行结果如图10.38所示。10.2Pandas运算6学生实践练习1.需求说明定义两个字典对象,分别为wordDicts1={"人民":3,"群众":2,"公平":4,"正义":6},wordDicts2={"司法":2,"社会":2,"公平":2},实现如下需求:(1)先将两个字典对象转化为Series对象,再合并转化后的Series对象。对合并后的Series对象进行排序和排名。(2)统计wordDicts1中关键字出现的总次数、关键字的个数及平均的次数。(3)将索引为“群众”的值设置为NaN,滤除Series对象中缺失的数据,即“群众”对应的记录。10.2Pandas运算6学生实践练习2.实现思路(1)使用“Series(字典对象)”语句将字典对象转化为Series对象。(2)使用“Series对象1.index.union(Series对象2.index)”语句合并两个Series对象的索引对象。(3)使用“Series对象.reindex(新的索引对象)”重新对Series对象进行索引。(4)使用“Series对象.fillna(0)”将值为NaN的数据填充为0。(5)使用“Series对象1+Series对象2”语句计算两个Series对象的和。(6)使用“Series对象.sort_values(ascending=False)”对值进行排序。(7)使用Series对象中的sum方法统计出关键字出现的总次数。(8)使用count方法统计关键字的个数。(9)使用mean方法统计平均的次数。(10)使用dropna方法滤除缺失的数据。知识架构10.3Pandas读写数据1CSV文件的读写3MySQL数据库的读写4学生实践练习2Excel文件的读写10.3Pandas读写数据1CSV文件的读写在Pandas模块中,使用read_csv方法读取CSV文件,该方法返回一个DataFrame对象。【语法】pandas.read_csv(filepath_or_buffer,sep=',',delimiter=None,header='infer',names=None,index_col=None,usecols=None,squeeze=False,prefix=None,mangle_dupe_cols=True,dtype=None,engine=None,converters=None,true_values=None,false_values=None,skipinitialspace=False,skiprows=None,nrows=None,na_values=None,keep_default_na=True,na_filter=True,verbose=False,skip_blank_lines=True,parse_dates=False,infer_datetime_format=False,keep_date_col=False,date_parser=None,dayfirst=False,iterator=False,chunksize=None,compression='infer',thousands=None,decimal=b'.',lineterminator=None,quotechar='"',quoting=0,escapechar=None,comment=None,encoding=None,dialect=None,tupleize_cols=None,error_bad_lines=True,warn_bad_lines=True,skipfooter=0,skip_footer=0,doublequote=True,delim_whitespace=False,as_recarray=None,compact_ints=None,use_unsigned=None,low_memory=True,buffer_lines=None,memory_map=False,float_precision=None)1.读取CSV文件到DataFrame10.3Pandas读写数据1CSV文件的读写在上述语法中,常用的参数介绍如下。(1)filepath_or_buffer:可以是URL,可用URL类型包括HTTP、FTP、S3和文件。(2)sep:指定分隔符。如果不指定参数,则会尝试使用逗号分隔。分隔符长于一个字符并且不是'\s+'的,将使用Python的语法分析器,并且忽略数据中的逗号。(3)delimiter:定界符,备选分隔符(如果指定该参数,则sep参数失效),默认为None。(4)header:指定行数用来作为列名,数据开始行数。如果文件中没有列名,则默认为0,否则设置为None。(5)names:表示结果的列名列表,如果数据文件中没有列标题行,就需要执行header=None。默认列表中不能出现重复,除非设定参数mangle_dupe_cols=True。(6)index_col:用作行索引的列编号或者列名,如果给定一个序列,则有多个行索引。(7)encoding:指定字符集类型,通常指定为'utf-8'。10.3Pandas读写数据1CSV文件的读写在下面的示例中,创建一个文件名称为user.csv的文本文件,文件内容如下:

Alice,23Mary,34Anna,28【示例10.6】使用read_csv方法读取该CSV文件。importpandasaspdprint(pd.read_csv("user.csv",names=['name','age'],delimiter=','))10.3Pandas读写数据1CSV文件的读写read_csv方法的使用如图10.40所示。10.3Pandas读写数据1CSV文件的读写2.将DataFrame对象写入CSV文件中在Pandas模块中,CSV文件使用to_csv方法写入。【语法】DataFrame.to_csv(path_or_buf=None,sep=',',na_rep='',float_format=None,columns=None,header=True,index=True,index_label=None,mode='w',encoding=None,compression=None,quoting=None,quotechar='"',line_terminator='\n',chunksize=None,tupleize_cols=False,date_format=None,doublequote=True,escapechar=None,decimal='.',**kwds)10.3Pandas读写数据1CSV文件的读写在上述语法中,常用的参数介绍如下:(1)path_or_buf:可以是URL,可用URL类型包括HTTP、FTP、S3和文件。(2)sep:指定分隔符。如果不指定参数,则会尝试使用逗号分隔。分隔符长于一个字符并且不是'\s+'的,将使用Python的语法分析器,并且忽略数据中的逗号。10.3Pandas读写数据1CSV文件的读写【示例10.7】使用to_csv方法写入到CSV文件。frompandasimportDataFramedf=DataFrame({'one':[1,2,3],'two':[2,3,4],'three':[3,4,5]})print("DataFrame对象为:\n",df)print(df.to_csv("test.csv",index=False,sep=","))10.3Pandas读写数据1CSV文件的读写to_csv方法的使用如图10.41所示。打开test.csv,内容如图10.42所示。10.3Pandas读写数据2Excel文件的读写使用Pandas读写Excel文件,需要安装openpyxl、xlsxwriter和xlrd这3个第三方库,与其他的库安装方式相同,可以使用PyCharm工具或者pip命令安装。下面介绍以上3个第三方库的安装方法:(1)openpyxl:模块openpyxl源于PHPExcel,它提供了针对.xlsx文件的读写功能,可以在命令行中执行“pipinstallopenpyxl”命令进行安装。(2)xlsxwriter:用来写入内容到.xlsx文件中。可以在命令行中执行“pipinstallxlsxwriter”安装。(3)xlrd:用来读取.xls和.xlsx文件中的数据,可以在命令行中执行“pipinstallxlrd”安装。10.3Pandas读写数据2Excel文件的读写在Pandas模块中,使用read_excel方法读取Excel文件。【语法】1.读取Excelpandas.read_excel(io,sheetname=0,header=0,skiprows=None,skip_footer=0,index_col=None,names=None,parse_cols=None,parse_dates=False,date_parser=None,na_values=None,thousands=None,convert_float=True,has_index_names=None,converters=None,engine=None,squeeze=False,**kwds)10.3Pandas读写数据2Excel文件的读写在上述语法中,常用的参数说明如下:(1)sheetname:表示表格的名称或索引,为0表示读取第一页,也可以传入读取表格的名称。(2)names:表示结果的列名列表,默认为None。(3)index_col:用作行索引的列编号或者列名,如果给定一个序列,则有多个行索引。10.3Pandas读写数据2Excel文件的读写例如,在本地E盘创建一个Excel文件,文件名为user.xlsx,内容见表10.4。10.3Pandas读写数据2Excel文件的读写使用read_excel方法读取该Excel文件,见示例10.8。importpandasaspdprint(pd.read_excel("E:\\user.xlsx",names=["name","age"]))read_excel方法的使用如图10.43所示。10.3Pandas读写数据2Excel文件的读写2.写入Excel在Pandas模块中,使用DataFrame对象提供的to_excel方法写入内容到Excel文件中。to_excel(self,excel_writer,sheet_name='Sheet1',na_rep='',float_format=None,columns=None,header=True,index=True,index_label=None,startrow=0,startcol=0,engine=None,merge_cells=True,encoding=None,inf_rep='inf',verbose=True,freeze_panes=None)【语法】在以上语法中,常用参数介绍如下:(1)excel_writer:表示需要写入到Excel文件的路径及文件名。(2)sheet_name:表示表格的名称。(3)columns:表示表格的列名。10.3Pandas读写数据3MySQL数据库的读写目前,数据库大部分都属于关系型的数据库,而编程语言大部分使用的数据是基于对象的,通过ORM(对象关系映射)技术可以实现数据库和编程语言之间数据的转换。在Python中,最有名的ORM框架是SQLAlchemy。使用SQLAlchemy写入数据到数据库中的步骤如下:(1)使用PyCharm工具或者pip命令安装SQLAlchemy库。使用pip命令安装SQLAlchemy库可以在命令行工具中执行“pipinstallsqlalchemy”命令进行安装。10.3Pandas读写数据3MySQL数据库的读写(2)导入SQLAlchemy模块中的create_engine方法和Pandas模块,代码如下:importpandasaspdfromsqlalchemyimportcreate_engine#引入create_engine方法(3)创建引擎,其中传入的字符串格式为:数据库类型+Python连接MySQL的库名://用户名:密码@IP地址:端口号/数据库名。例如,在示例10.9中,使用PyMySQL连接,需安装PyMySQL,用户名为root,密码为123456,数据库名为userdb,代码如下:conn=create_engine('mysql+pymysql://root:123456@localhost:3306/newsdb?charset=utf8')10.3Pandas读写数据3MySQL数据库的读写(4)使用Pandas的io.sql模块下的to_sql方法,将DataFrame对象中的数据保存到数据库中,其中num表示表名,newsdb表示数据库名,代码如下:pd.io.sql.to_sql(df,'num',conn,schema='newsdb',if_exists='append')(5)使用Pandas模块中的read_sql方法读取数据库中的记录并保存到DataFrame对象中,代码如下:df1=pd.read_sql('select*fromnum;',con=conn)10.3Pandas读写数据3MySQL数据库的读写【示例10.9】数据库的读写操作。frompandasimportDataFrameimportpandasaspdfromsqlalchemyimportcreate_engine#引入create_engine方法df=DataFrame({1:['Anna','Alice','Tom'],2:[23,27,56]})conn=create_engine('mysql+pymysql://root:123456@localhost:3306/userdb?charset=utf8')#将df对象的数据保存到user表中pd.io.sql.to_sql(df,'num',conn,schema='userdb',if_exists='append')#从数据库中读取user表记录保存到DataFrame对象中df1=pd.read_sql('select*fromnum;',con=conn)print(df1)10.3Pandas读写数据3MySQL数据库的读写数据库的读写操作的运行结果如图10.44所示。10.3Pandas读写数据3MySQL数据库的读写保存到UserDB数据库中user表数据如图10.45所示。10.3Pandas读写数据4学生实践练习1.需求说明定义一个字典对象,内容为“{"人民":3,"群众":2,"公平":4,"正义":6}”,将该对象转化为DataFrame对象,将DataFrame对象分别保存到CSV文件、Excel文件和MySQL数据库中,并分别以3种方式读取其中的内容,转化为新的DataFrame对象。2.实现思路(1)使用DataFrame对象中的to_csv方法将对象中的内容保存到CSV文件中。(2)使用Pandas模块中的read_csv方法读取CSV文件中的内容,并转化为DataFrame对象。10.3Pandas读写数据4学生实践练习(3)使用DataFrame对象中的to_excel方法将对象中的内容保存到Excel文件中。(4)使用Pandas模块中的read_excel方法读取Excel文件中的内容,并转化为DataFrame对象。(5)使用“pd.io.sql.to_sql(df,'words',conn,schema='newsdb',if_exists='append')”语句将DataFrame对象保存到MySQL数据库中。(6)使用Pandas模块中的read_sql方法从数据库中读取数据并保存在DataFrame对象中。知识架构10.4Pandas和Matplotlib绘图2Pandas绘图3学生实践练习Matplotlib绘图110.4Pandas和Matplotlib绘图1Matplotlib绘图1.Matplotlib安装Matplotlib是Python中最常用的可视化工具之一,可以非常方便地创建海量类型的2D图表和一些基本的3D图表。Matplotlib最早是为了可视化癫痫病人的脑皮层电图相关的信号而研发的,因为在函数的设计上参考了MATLAB,所以叫作Matplotlib。Matplotlib首次发表于2007年,在开源和社区的推动下,目前在基于Python的各个科学计算领域都得到了广泛应用。Matplotlib的安装和其他第三方库的安装方式相同,可以使用pip命令和PyCharm工具进行安装。下面将分别介绍这两种安装方式。10.4Pandas和Matplotlib绘图1Matplotlib绘图1)使用pip命令安装将Python的Scripts目录添加到Path环境变量中,打开命令行工具,执行“pipinstallmatplotlib”命令进行安装。2)使用PyCharm工具进行安装依次单击菜单中的“File”→“Settings…”,打开PyCharm的设置界面,单击设置界面的“Project工程名”(此处为“Projectchapter10”)下的“ProjectInterpreter”菜单,如图10.48所示,单击“+”按钮添加Matplotlib库。10.4Pandas和Matplotlib绘图1Matplotlib绘图2.Matplotlib画图Matplotlib中最基础的模块是pyplot,可以使用“importmatplotlib.pyplotasplt”语句导入pyplot模块,并取该模块的别名为plt。使用pyplot模块中的plot方法实现折线图的绘制。【示例10.10】实现简单折线图的绘制。#导入pyplot模块,并取该模块的别名为pltimportmatplotlib.pyplotasplt#设置3个坐标:1,52,7和3,4plt.plot([1,2,3],[5,7,4])plt.show()#显示折线图10.4Pandas和Matplotlib绘图1Matplotlib绘图折线图的运行后效果如图10.49所示。10.4Pandas和Matplotlib绘图1Matplotlib绘图很多时候,虽然根据图就可以看出一些信息,但是图形带有标题、轴域上的标签和图例,解释该图的作用也非常有必要。在plot方法中添加label参数可以指定线条的名称,通过title方法指定图表的名称,使用xlabel指定横坐标的名称,使用ylabel指定纵坐标的名称,具体使用方式见示例10.11。10.4Pandas和Matplotlib绘图1Matplotlib绘图【示例10.11】importmatplotlibasmplmpl.rcParams['font.sans-serif']=['SimHei']#用来正常显示中文标签mpl.rcParams['axes.unicode_minus']=False#用来正常显示负号#导入pyplot模块,并取该模块的别名为pltimportmatplotlib.pyplotasplt#设置3个坐标:1,52,7和3,4plt.plot([1,2,3],[5,7,4])plt.xlabel(u'x轴')#设置横坐标的名称plt.ylabel(u'y轴')#设置纵坐标的名称plt.title(u'图表')#指定图表的标题plt.legend()#生成默认的图例plt.show()10.4Pandas和Matplotlib绘图1Matplotlib绘图折线图运行后的效果如图10.50所示。图10.50中

允许以各种形式保存图形。

允许对图形和绘图配置各种间距选项。importmatplotlibasmplmpl.rcParams['font.sans-serif']=['SimHei']#用来正常显示中文标签mpl.rcParams['axes.unicode_minus']=False#用来正常显示负号importmatplotlib.pyplotaspltbar_width=0.35opacity=0.4plt.bar([1,2,3],[5,7,4],bar_width,alpha=opacity,color='b',label=u'横坐标')plt.show()10.4Pandas和Matplotlib绘图1Matplotlib绘图plot()方法中还可以传入多个参数,其中第三个参数表示线条的颜色及类型,如传入“r-”值表示红色的实线,其中“r”表示红色,“b”表示蓝色,“-”表示实线,“-.”表示点画线,“:”表示虚线,“None”表示什么都不画。第4个参数表示线条的宽度。【示例10.12】使用plt.plot([1,2,3],[5,7,4],'r-',lw=2.5)语句输出红色的实线,线条的宽度为2.5。使用Matplotlib画柱状图时需要使用pyplot模块中的bar()方法。10.4Pandas和Matplotlib绘图1Matplotlib绘图柱状图运行后的效果如图10.51所示。除了折线图和柱状图,Matplotlib还可以绘制饼图、散点图等。10.4Pandas和Matplotlib绘图2Pandas绘图1.线形图Series和DataFrame都有一个用于生成各类图标的plot方法,默认情况下,生成的是线型图。【示例10.13】创建一个Series对象和DataFrame对象,并生成线形图。frompandasimportSeries,DataFrameimportnumpyasnpimportmatplotlib.pyplotasplts=Series(np.random.randn(10).cumsum(),index=np.arange(0,100,10))s.plot()plt.show()df=DataFrame(np.random.randn(10,4).cumsum(0),columns=['A','B','C','D'],index=np.arange(0,100,10))df.plot()#绘制效果如下plt.show()10.4Pandas和Matplotlib绘图2Pandas绘图Series和DataFrame的折线图显示如图10.52所示,其中左侧的图表为Series对象由示例10.13可以看出,Series对象的索引会被传给Matplotlib,并用以绘制X轴,可以通过use_index=False禁用该功能。X轴的刻度和界限可以通过xticks和xlim选项进行调节。Y轴就用yticks和ylim进行调节。10.4Pandas和Matplotlib绘图2Pandas绘图2.柱状图Series和DataFrame也可以绘制柱状图,与折线图类似,它也使用plot()方法绘制。不过绘制柱状图需要在plot()方法中传入kind参数。plot()方法的参数见表10.5。10.4Pandas和Matplotlib绘图2Pandas绘图在DataFrame对象的plot方法中还有一些独有的参数,见表10.6。10.4Pandas和Matplotlib绘图2Pandas绘图在生成线形图的代码中,加上kind='bar'(垂直柱状图)或kind='barh'(水平柱状图)即可生成柱状图。【示例10.14】创建一个Series对象和DataFrame对象,并生成柱状图。frompandasimportSeries,DataFrameimportnumpyasnpimportmatplotlib.pyplotasplts=Series(np

温馨提示

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

评论

0/150

提交评论