Python程序设计基础及应用(微课版)课件 -第9章 数据分析基础_第1页
Python程序设计基础及应用(微课版)课件 -第9章 数据分析基础_第2页
Python程序设计基础及应用(微课版)课件 -第9章 数据分析基础_第3页
Python程序设计基础及应用(微课版)课件 -第9章 数据分析基础_第4页
Python程序设计基础及应用(微课版)课件 -第9章 数据分析基础_第5页
已阅读5页,还剩55页未读 继续免费阅读

下载本文档

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

文档简介

Python程序设计基础及应用《Python程序设计基础及应用》配套课件第九章数据分析基础Python程序设计基础及应用目录9.1NumPy-科学计算的基石9.2Pandas-数据分析的瑞士军刀9.3数据清洗与聚合9.4数据的读取与存储9.5案例实战Python程序设计基础及应用9.1多维数组对象ndarrayNumpy提供了两种基本的对象:ndarray:英文全称为n-dimensionalarrayobject,称为多维数组,后统一称之为数组。ufunc:英文全称为universalfunctionobject,它是一种能够对数组进行处理的特殊函数。Numpy库的核心对象是n维数组对象ndarray,Python中所有的函数都是围绕ndarray对象进行的。ndarray数组能够对整块数据进行数学运算,通常来说,ndarray是存储单一数据的容器,即其中的所有元素都需要是相同的类型,和list不同,它能直接保存数据,而list保存的是对象的引用。1.创建数组(1)数组属性1.创建数组(2)数组的创建创建数组最简单的方法就是使用Numpy提供的array()函数,通过给array()函数传递序列对象来创建数组,如果传递的是多层嵌套的序列,则创建多维数据。创建数组时,numpy会为新建的数组推断出一个合适的数据类型,并保存在dtype属性中。importnumpyasnpdata1=[1,2,3,4]arr1=np.array(data1)print(arr1)array([1.,2.,3.,4.])1.创建数组data2=[[1,2,3],[4,5,6]]arr2=np.array(data2)print(arr2) #array([[1,2,3],[4,5,6]])print(arr2.ndim) #2print(arr2.shape) #(2,3)print(arr2.size) #6print(arr2.dtype) #dtype('int32')1.创建数组在对数组进行操作时,经常要改变数组的维度。可以通过修改数组的shape属性,在保持数组元素个数不变的情况下,改变数组每个轴的长度。arr2.shape=(3,2)print(arr2) #array([[1,2],[3,4],[5,6]])arr2.shape=(1,-1)print(arr2) #array([[1,2,3,4,5,6]])2.变换数组形状(4)自动生成数组numpy提供了很多专门用于创建数组的函数。arange()类似于内置函数range(),通过指定开始值、终值和步长来创建表示等差数列的一维数组,注意所得到的结果中不包含终值。

np.arange(10)

输出:array([0,1,2,3,4,5,6,7,8,9])np.arange(1,13,2)

输出:array([1,3,5,7,9,11])1.创建数组linspace()通过指定幵始值、终值和元素个数来创建表示等差数列的一维数组,可以通过endpoint参数指定是否包含终值,默认值为True,即包含终值。np.linspace(1,10,10)

输出:array([1.,2.,3.,4.,5.,6.,7.,8.,9.,10.])np.linspace(1,10,10,endpoint=False)

输出:array([1.,1.9,2.8,3.7,4.6,5.5,6.4,7.3,8.2,9.1])3.自动生成数组logspace()和linspace()类似,通过指定开始指数、结束指数和元素个数来创建表示等比数列的一维数组,可以通过指定base参数来确定底数,默认为10,还可以通过endpoint参数确定是否包括结束指数,默认为True,表示包含。np.logspace(0,3,4)输出:array([1.,10.,100.,1000.])np.logspace(0,3,4,base=2)输出:array([1.,2.,4.,8.])3.自动生成数组numpy提供了强大的生成随机数的功能,然而,真正的随机数很难获得,实际中使用的都是伪随机数。大部分情况下,伪随机数就能满足要求。与随机数相关的函数都在random模块中,其中包含了可以生成服从多种概率分布随机数的函数。4.随机数函数(5)随机数函数4.随机数函数(1)

一维数组的索引和切片一维数组的索引类似于Python中的列表,可以使用和列表相同的方式对数组的元素进行存取。和列表不同的是,通过切片获取的新的数组是原始数组的一个视图,它与原始数组共享同一块数椐存储空间,这就意味着在视图上的操作都会使得原始数组发生改变。如果需要的并非视图而是要复制数据,则可以通过copy()方法来实现,这时新旧两个数组不共享同一块数据存储空间。arr4[0:2]=10,11输出:array([10,11,3,4,5,6,7,8,9])arr5=arr4[2:4]输出:array([3,4])5.索引和切片(2)

二维数组的索引与切片对于二维数组,可以在单个或者2个轴向上完成切片,也可以和整数索引一起混合使用。当使用整数列表对数组元素进行存取时,将使用列表中的每个元素作为下标,这种索引称为“花式索引”。注意:使用列表作为下标得到的数组不和原始数组共享数据。arr=np.arange(32).reshape((8,4))#输出:array([[0,1,2,3],[4,5,6,7],[8,9,10,11],[12,13,14,15],[16,17,18,19],[20,21,22,23],[24,25,26,27],[28,29,30,31]])arr[[1,5,7,2],[0,3,1,2]]#输出:array([4,23,29,10])5.索引和切片Python程序设计基础及应用9.2数组运算通用函数(ufunc)是一种对数组中每个元素进行操作的函数,用法也很简单。通用函数支持全部的四则运算(+、-、*、/、**),并且保留习惯的运算符,但是需要注意,操作的对象是数组。数组间的四则运算表示对每个数组中的元素分别进行四则运算,所以进行四则运算的两个数组的形状必须一致。通用函数也支持比较运算(>、>=、<、<=、==、!=、all、any),返回结果是一个布尔数组,其每个元素对应元素的比较结果。1.通用运算a=np.arange(1,10,1).reshape(3,3)b=np.arange(10,19,1).reshape(3,3)b-a #输出:array([[9,9,9],[9,9,9],[9,9,9]])b/a #输出:array([[10.,5.5,4.],[3.25,2.8,2.5],[2.28571429,2.125,2.]])a[0]=20a>=b #输出:array([[True,True,True],[False,False,False],[False,False,False]],dtype=bool)1.通用运算2.统计函数在统计分析和数据挖掘中,经常会使用到统计运算。Python程序设计基础及应用9.3Pandas数据结构Series类似于一维数组,由一组数据(可以是任意的Numpy数据类型)和一组称之为数据标签的索引组成。(1)Series对象的创建通过列表数据产生frompandasimportSeries #导入pandas库中Series模块pds1=Series([1,2,3,4])#输出01122334dtype:int641.Series(序列)(1)Series对象的创建通过指定索引的方式pds2=Series([1,2,3,4],index=['a','b','c','d'])#输出a1b2c3d4dtype:int641.Series(序列)(1)Series对象的创建通过字典方式创建data={"i1":1,"i2":2,"i3":3,"i4":4}ps3=Series(data,index=['i1','i2','i3','i4'])#

字典是无序的,因此指定索引排列顺序#输出i11i22i33i44dtype:int641.Series(序列)DataFrame是一种类似于关系表的表格型数据结构,DataFrame对象是一个二维表格,其中,每列中的元素类型必须一致,而不同的列可以拥有不同的元素类型。它是数据科学中最为广泛使用的数据结构之一。Pandas提供了将其它数据结构转换为DataFrame的方法,还提供了众多的输入输出函数来将各利文件格式转换成DataFrame。使用DataFrame前,需要导入pandas库中的DataFrame模块(frompandasimportDataFrame)。创建DataFrame的方法有很多,最常用的是传入二维数组、由数组、Series、列表或者元组组成的字典给DataFrame()。2.DataFrame(数据框)data={"name":["王晓明","李静","田海"],"sex":["男","女","男"],"aged":[20,19,21]}#

字典是无序的,因此需要通过columns指定列索引的排列顺序df=DataFrame(data,columns=["name","sex","aged"])DataFrame数据有列索引和行索引,行索引类似于关系表中每行的编号(未指定行索引的情况下,会使用0到N-1作为行索引),列索引类似于表格的列名(也称为字段)。df1=DataFrame(data,columns=["name","sex","aged"],index=["L1","L2","L3"])2.DataFrame(数据框)重新索引就是对索引进行重新排序,而索引对象是无法修改的。1)Series对象的重新索引通过Series的reindex()方法可以调整index的次序,但不是定义一个全新的index,也就是说调整后的index必须为已经存在的index,只是改变了原有index顺序而已,否则自动增加index,对应的元素值为NaN(notanumber)缺失值。可以通过Series对象的isnull()方法或者notnull()方法来寻找缺失值。注意:使用reindex()方法不改变原来对象。3.重新索引重新索引就是对索引进行重新排序,而索引对象是无法修改的。1)Series对象的重新索引通过Series的reindex()方法可以调整index的次序,但不是定义一个全新的index,也就是说调整后的index必须为已经存在的index,只是改变了原有index顺序而已,否则自动增加index,对应的元素值为NaN(notanumber)缺失值。可以通过Series对象的isnull()方法或者notnull()方法来寻找缺失值。注意:使用reindex()方法不改变原来对象。obj.reindex(index=["b","c","a","d","e","n"])#使用reindex方法调整index顺序3.重新索引重新索引就是对索引进行重新排序,而索引对象是无法修改的。

(2)DataFrame对象的重新索引df=DataFrame(np.arange(9).reshape(3,3),index=["L1","L2","L3"],columns=["id1","id2","id3"])#

对df重新索引,新增的L4行标签对应的缺失值通过fill_value参数指定为9df2=df.reindex(index=["L1","L2","L3","L4"],columns=["id3","id2","id1"],fill_value=9)3.重新索引有时我们希望将列数据作为行索引,这时可以通过set_index()方法来更换索引,生成一个新的DataFrame,原来DataFrame不会发生变换。与set_index()方法相反的方法是reset_index()。data={"name":("张三","李四","王五","赵六"),"sex":("男","女","女","男"),"aged":(20,19,20,21),"score":(80,60,70,90)}df=DataFrame(data)#使用字典创建DataFrame对象df1=df.set_index("name")#使用name列更换默认行索引4.更换索引Python程序设计基础及应用9.4数据选择和运算(1)Series对象的索引和切片Series对象有两个特殊的属性index:由ndarray数组继承的Index索引对象,保存标签信息。values:保存元素值的ndarry数组,numpy的函数都对此数组进行处理。Series对象中元素的索引支持位置下标和标签下标两种形式。Series对象还支持位置切片和标签切片位置切片遵循Python的切片规则,包括起始位置,但不包括结束位置;但标签切片则同时包括起始标签和结束标签。1.索引和切片(1)Series对象的索引和切片Series对象有两个特殊的属性index:由ndarray数组继承的Index索引对象,保存标签信息。values:保存元素值的ndarry数组,numpy的函数都对此数组进行处理。Series对象中元素的索引支持位置下标和标签下标两种形式。Series对象还支持位置切片和标签切片位置切片遵循Python的切片规则,包括起始位置,但不包括结束位置;但标签切片则同时包括起始标签和结束标签。1.索引和切片(2)DataFrame索引和切片相比一维数组的数列Series数据选取,二维数组的数据框DataFrame数据选取更复杂,选取列和行都有具体的使用方法。DataFrame有两个索引对象:索引行标签的index和索引列标签的columns。使用索引对象的values()方法可以获取对应标签的数组对象,这些对象可以供numpy使用。通过列索引标签或者以属性的方式可以单独获取DataFrame的列数据,返回的数据为Series结构,通过标签列表可以获取多个列的数据。通过行索引标签或者行索引位置(0到N-1)的切片形式可以选取行数据。位置切片遵循Python的切片规则,包括起始位置,但不包括结束位置。标签切片则同时包括起始标签和结束标签。两种形式的切片返回结果都为DataFrame的子集。1.索引和切片(2)DataFrame索引和切片df["name"] #选取name列,也可以使用,返回一个Series对象,等价于df[["name","sex"]]#选取name、sex列,返回一个DataFrame对象1.索引和切片(1)增加行增加行数据可以通过append()函数传入字典数据即可。append_data={"name":"朱八","sex":"男","aged":23,"score":65}new_df=df.append(append_data,ignore_index=True)2.操作行和列(2)增加列增加列可以直接通过标签索引方式进行,当新增的列中的数值不一样时,可以传入列表或者数组结构进行赋值。new_df["city"]=["北京","西安","长春","珠海","昆明"]2.操作行和列(3)删除使用drop()函数可以删除指定轴上的信息,原来的DataFrame数据不会删除。new_df.drop(2)#删除行索引是2的信息2.操作行和列3.函数应用和映射在数据分析时,常常会对数据进行较复杂的数据运算,这时需要定义函数。定义好的函数可以应用到pandas数据中,其中有3种方法:map()函数,将函数应用到Series的每个元素中apply()函数,将函数应用到DataFrame的行与列上applymap()函数,将函数应用到DataFrame的每个元素上3.函数应用和映射data={"name":["张三","李四","王五"],"length":["172cm","175cm","168cm"]}df=DataFrame(data)deff(s):returns.split("cm")[0]df["length"]=df["length"].map(f)#在length列(Series对象)上的每个元素应用map函数3.函数应用和映射df1=pd.DataFrame(np.random.rand(3,3),columns=["a","b","c"])f=lambdax:x.mean()#定义lambda表达式,求均值df1.apply(f,axis=0)#沿列方向应用f,求每列的均值a0.304962b0.496319c0.570561dtype:float644.排序在Series中,通过sort_index()方法对索引进行排序,默认为升序;通过sort_values()方法对值进行排序,默认是升序。对于DataFrame数据而言,通过指定轴方向,使用sort_index()方法可以对行或者列索引进行排序。要根据列进行排序,可以通过sort_values()方法,把列名传给by参数即可。frame=DataFrame(np.arange(8).reshape((2,4)),index=['two','one'],columns=['d','a','b','c'])frame.sort_index()#默认axis=0,按照纵轴行索引升序排列5.统计信息在DataFrame数据中,通过sum()方法可以对每列进行求和和汇总,还可以指定要汇总的轴方向,方法返回一个Series对象。df=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'])6.唯一值和计数通过Series对象的unique()方法可以获取不重复的数据,而通过Series对象的values_counts()方法可以统计每个值出现的次数。df=DataFrame({'Va1':[1,3,4,3,4],'Va2':[2,3,1,2,3],'Va3':[1,5,2,4,4]})Python程序设计基础及应用9.5数据清洗1.处理缺失值现实中通过各种方式收集到的数据可能是“肮脏”的,使用前需要进行数据的清洗。数据清洗包括缺失值处理、重复数据的处理和替代值处理等具体操作。(1)处理缺失值在大多数的数据分析应用程序中,缺少数据是常见的,缺少的值被pandas标注为np.nan也就是缺失值NaN。设计pandas的目标之一是使处理丢失的数据尽可能的轻松。在Python基础语法中,None不能参加计算,而缺失值NaN可以参加运算。在Pandas中,二者是一样的,都可以参加算术计算,None自动转换成NaN,np.nan属于float类型。1.处理缺失值1.处理缺失值使用fillna()方法可以对缺失值进行填补,参数value设置填补值,method参数设置填补方式,“ffill”使用前面值填补,“bfill”使用后面值填补。使用dropna()方法可以对缺失值进行删除,可以定义删除方式,当how参数为“any”时,删除任何包含NaN的行或列,当how为“all”时,删除所有数据为NaN的行或列。NA=np.nanA=DataFrame([[1,2,3.],[4,5,NA],[6,NA,7]],columns=list("abc"),index=list("123"))A.isnull()#为True的就是缺失值2.异常重复数据在DataFrame中,通过duplicated()方法判断各行是否存在重复数据。data={"id":[1,2,3,1,4],"name":["apple","pear","banana","apple","peach"],"price":[5,4,3,5,3]}df=DataFrame(data)2.异常重复数据在DataFrame中,通过duplicated()方法判断各行是否存在重复数据。data={当发现重复数据时,通过方法drop_duplicates()删除,该方法默认删除完全重复的行,只保留第一次出现的数据。也可以指定部分列作为判断重复项的依据。"id":[1,2,3,1,4],"name":["apple","pear","banana","apple","peach"],"price":[5,4,3,5,3]}df=DataFrame(data)3.替换值在pandas中,通过replace()方法完成值的替换工作,可以单值替换,也可以多值替换,这时参数传入方式可以是列表也可以是字典。data={"name":["张三","李四","王五","赵六"],"sex":["男","男","女","女"],"aged":[20,19,np.nan,21],"birth_city":["北京","西安","沈阳",""]}df=DataFrame(data)Python程序设计基础及应用9.6聚合运算聚合运算就是对分组后的数据进行计算,产生标量值的过程。1.聚合运算方法max_bill=tips.groupby('sex')['total_bill'].max()min_bill=tips.groupby('sex')['total_bill'].min()对于更复杂的聚合运算,可以自定义聚合函数,通过aggregate或agg()方法传入。defget_range(x):returnx.max()-x.min()bills_range=tips.groupby('sex')['total_bill'].agg(get_range)bills_range1.聚合运算方法(1)单列多函数对agg()方法的参数传入多函数列表,即可完成一列的多函数运算。如果不想使用默认的运算函数名作为列名,可以以元组的形式传入,前面是名称,后面为聚合函数。tips.groupby(['sex','smoker'])['tip'].agg(['mean','std',get_range])tips.groupby(['sex','smoker'])['tip'].agg([('小费均值','mean'),('极差',get_range)])2.多函数应用(2)多列多函数对多列进行多聚合函数运算时,会产生层次化索引。#

在小费集的total_bill和tip列上应用聚合函数tips.groupby(['day','time'])['total_bill','tip'].agg([('tip_mean','mean'),('Range',get_range)])2.多函数应用Python程序设计基础及应用9.7数据读取与存取Pandas提供了将表格型数据读取为DataFrame数据结构的函数:read_csv()和read_table()。其中read_csv()是读取CSV文件,默认分隔符是逗号“,”。read_table()是读取文本文件,默认分隔符

温馨提示

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

评论

0/150

提交评论