人工智能基础(Python实现)-课件 第4章Pandas数据分析库_第1页
人工智能基础(Python实现)-课件 第4章Pandas数据分析库_第2页
人工智能基础(Python实现)-课件 第4章Pandas数据分析库_第3页
人工智能基础(Python实现)-课件 第4章Pandas数据分析库_第4页
人工智能基础(Python实现)-课件 第4章Pandas数据分析库_第5页
已阅读5页,还剩95页未读 继续免费阅读

下载本文档

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

文档简介

第4章

Pandas数据分析库本章学习目标01了解Pandas数据分析库以及数据结构的基本概念。03熟悉Pandas中数据框的索引、切片、布尔索引等数据选择技术,以及如何进行数据的合并、连接和转换。05学习Pandas中的数据清洗技巧,包括处理缺失值、异常值、重复值,以及数据类型转换,确保数据质量。02掌握利用Pandas进行数据结构创建与操作。04理解Pandas在处理时间序列数据时的优势,包括时间序列的生成、索引设置、时间间隔计算、重采样、移动窗口计算和时间序列数据分析。06培养使用Pandas解决实际数据分析问题的能力。目录4.2数据选择与过滤4.3数据分组与聚合4.4合并和连接4.1Pandas数据结构的创建与操作4.5数据读取和存储4.6数据清洗和预处理4.7时间序列处理pandas导入惯例importpandasaspd01frompandasimportSeries02frompandasimportDataFrame034.1Pandas数据结构的创建与操作

序列创建与基本操作4.1.1数据框创建与基本操作4.1.24.1Pandas数据结构的创建与操作序列概念:序列是用于存储一维数组的结构。要素:一组数据和对应的索引,索引可以是默认的整数索引或用户自定义的标签。4.1.1序列创建与基本操作1.创建方法实例演示(1)用列表作为参数,并且不指定索引,自动生成整数索引In:a=Series([6.3,43.1,24.4])aOut:06.3143.1224.4dtype:float644.1.1序列创建与基本操作1.创建方法实例演示(2)用numpy数组作为参数,并且用index参数指定标签。In:chengji=Series(np.array((70,85,90)),index=['语文','数学','英语'])chengjiOut:语文70#标签表示课程,值表示分数数学85英语904.1.1序列创建与基本操作1.创建方法实例演示(3)创建序列对象后通过该对象的index属性修改标签。In:gu=Series([6.3,43.1,24.4])gu.index=['幸福银行','平安科技','南方通信']guOut:幸福银行6.3#标签表示股票的名称,值表示股票的价格平安科技43.1南方通信24.4对比有标签的对象和没有标签的对象,区别在哪里?4.1.1序列创建与基本操作2.访问对象的元素实例演示(1)通过索引。无论对象有无标签,都可以通过索引访问其中的元素。(2)通过标签。当对象有标签时,可以通过标签访问对应的元素。通过自定义标签,用户可以方便地理解和访问数据,而不需要依赖整数索引。In:a[1]Out:43.1In:gu[2]Out:24.4In:chengji['数学']Out:85In:gu['南方通信']Out:24.44.1.1序列创建与基本操作3.对序列对象切片实例演示对序列对象切片,切片得到的是原始对象的视图。有如下方法。(1)索引切片。通过索引切片与对Python可迭代对象切片的方法相同。(2)标签切片。通过标签切连续的元素,语法格式如下:对象['起始标签':'结束标签']In:gu[0:2]Out:幸福银行6.3平安科技43.1In:gu['平安科技':'南方通信']Out:平安科技43.1南方通信24.44.1.1序列创建与基本操作4.增加元素和修改序列元素实例演示创建好序列对象后,还可以增加元素和修改其中的元素,方法与Python字典对象相同,语法格式如下:对象['标签1']=值当原对象中存在标签1时,该语句修改它的值。反之,则在其中增加标签1,以及对应的值。In:gu['南方通信']=25.3gu['光明证券']=17.78guOut:幸福银行6.30平安科技43.10南方通信25.30#修改了元素值光明证券17.78#增加了一个元素4.1.1序列创建与基本操作5.删除元素实例演示使用序列对象的drop()方法来删除一个或多个元素。通过指定元素的标签,drop()删除指定元素并返回一个新序列对象,其中不包含被删除的元素。需要注意的是,drop()默认不会修改原始序列,除非使用inplace=True参数。(1)删除单个元素时,直接将元素的标签值传给drop函数。In:gudel=gu.drop('光明证券')gudel#新对象删除了光明证券Out:幸福银行6.3平安科技43.1南方通信25.34.1.1序列创建与基本操作5.删除元素实例演示(2)删除多个元素时,将多个标签值封装到一个列表传给drop函数,列表中标签的顺序可以与序列对象中的顺序不同。(3)如果要在原始对象序列中删除指定标签值,需要指定inplace参数。In:gudel=gu.drop(['光明证券','平安科技'])gudel#新对象删除了光明证券和平安科技Out:幸福银行6.3南方通信25.3In:gu.drop('光明证券',inplace=True)gu#在原始对象中删除了光明证券Out:幸福银行6.3平安科技43.1南方通信25.34.1.1序列创建与基本操作6.运算操作实例演示序列对象支持多种运算操作,如数值运算、逻辑运算等,且这些运算能够在整个数据序列上高效执行。In:open=Series([23.5,6.1,42.1],index=['南方通信','幸福银行','平安科技'])open+1.0Out:南方通信24.5幸福银行7.1平安科技43.1In:open>10.0Out:南方通信True幸福银行False平安科技True4.1.1序列创建与基本操作6.运算操作实例演示序列之间也可以进行运算,Pandas会根据索引对齐数据进行操作。即使两个序列的索引不同,也能自动处理数据的对齐问题,自动对齐大大提升了数据操作的灵活性和简便性,使得数据分析变得更加高效、可靠。In:close=Series([44.3,22.6,6.5],index=['平安科技','南方通信','幸福银行',])close–openOut:南方通信-0.9平安科技2.2幸福银行0.4两个序列对象的索引顺序不同,系统自动处理数据对齐。4.1.2数据框创建与基本操作1.创建数据框实例演示数据框是一种二维的数据结构,用于存储和处理表格数据,它具有行和列的标签。创建数据框对象时需要分别指定行、列标签。常用两种方法创建数据框。(1)从字典创建。字典的键成为列标签,再用index参数指定行标签。In:data={'平安科技':[45.2,47.1,46.5,49.8],'南方通信':[31.9,27.3,25.2,24.5],'幸福银行':[3.4,4.6,5.2,6.8]}df=DataFrame(data,index=['2024-01','2024-02','2024-03','2024-04'])dfOut:平安科技南方通信幸福银行2024-0145.231.93.42024-0247.127.34.62024-0346.525.25.22024-0449.824.56.84.1.2数据框创建与基本操作1.创建数据框实例演示(2)从二维列表创建。二维列表的元素成为数据框的行数据,再用index参数指定行标签和columns参数指定列标签。In:data=[[45.2,31.9,3.4],[47.1,27.3,4.6],[46.5,25.2,5.2],[49.8,24.5,6.8]]col=['平安科技','南方通信','幸福银行']ind=['2024-01','2024-02','2024-03','2024-04']df=DataFrame(data,columns=col,index=ind)dfOut:平安科技南方通信幸福银行2024-0145.231.93.42024-0247.127.34.62024-0346.525.25.22024-0449.824.56.84.1.2数据框创建与基本操作2.在数据框末尾追加新行实例演示创建数据框对象后,在pandas2.x版本中,使用concat()方法在数据框末尾追加新行。In:new_row=pd.DataFrame({'平安科技':45.6,'南方通信':26.4,'幸福银行':5.8},index=['2024-05'])#新行也是一个数据框df=pd.concat([df,new_row])Out:平安科技南方通信幸福银行2024-0145.231.93.42024-0247.127.34.62024-0346.525.25.22024-0449.824.56.82024-0545.626.45.84.1.2数据框创建与基本操作2.在数据框末尾追加新行实例演示在pandas1.x版本中,可以通过append()方法在数据框末尾追加新行。该方法的参数可以是一个字典或者序列对象,结果有两种情况。(1)参数是序列对象,且包含name属性。序列对象的数据添加到数据框对象的末尾,它的name属性作为新行的行标签。In:s=pd.Series({'平安科技':45.6,'南方通信':26.4,'幸福银行':5.8},name='2024-05')df.append(s)Out:平安科技南方通信幸福银行2024-0145.231.93.42024-0247.127.34.62024-0346.525.25.22024-0449.824.56.82024-0545.626.45.8#name作为行标签4.1.2数据框创建与基本操作2.在数据框末尾追加新行实例演示(2)参数是字典或者无name属性的序列对象。需要通过设置ignore_index=True来自动生成新的行索引。append方法生成一个新数据框对象,而不修改原始对象。如果要修改原始对象,只需将它的返回值赋值给原对象,如:df=df.append(参数)In:df.append({'平安科技':45.6,'南方通信':26.4,'幸福银行':5.8},ignore_index=True)Out:平安科技南方通信幸福银行045.231.93.4#新生成的对象重建了行标签147.127.34.6246.525.25.2349.824.56.8445.626.45.84.1.2数据框创建与基本操作3.增加新列实例演示可以直接通过赋值的方式增加新列,格式如下:对象['新列名']=数据

#数据可以是列表和序列对象,长度要与原对象相同。In:df['三一重工']=[14.2,15.6,17.8,16.5]Out:平安科技南方通信幸福银行五一重工2024-0145.231.93.414.22024-0247.127.34.615.62024-0346.525.25.217.82024-0449.824.56.816.54.1.2数据框创建与基本操作4.删除行和列实例演示数据框对象的drop方法可以用来删除行和列,该方法的格式如下:对象.drop('标签名',axis,inplace)删除行时标签名为行标签名,axis为0或者不提供该参数。删除列时标签名为列标签名,axis为1。inplace的值为True直接修改原始对象,否则生成一个新对象。In:df.drop('2024-02')#删除一行Out:平安科技南方通信幸福银行五一重工2024-0145.231.93.414.22024-0346.525.25.217.82024-0449.824.56.816.5In:df.drop('幸福银行',axis=1)#删除一列Out:平安科技南方通信五一重工2024-0145.231.914.22024-0247.127.315.62024-0346.525.217.82024-0449.824.516.54.1.2数据框创建与基本操作5.对数据进行排序实例演示sort_values()方法用于根据指定列或索引对数据进行排序。它能够对一列或多列的数据按升序或降序排列,默认情况下为升序。In:data={'姓名':['张军','王怡','李和'],'年龄':[25,30,25],'体重':[67,82,76]}df=pd.DataFrame(data)df.sort_values(by='体重')#按体重升序排序Out:姓名年龄体重2李和25760张军25671王怡3082In:df.sort_values(by='体重',ascending=False)#降序排序Out:姓名年龄体重1王怡30820张军25672李和25764.1.2数据框创建与基本操作5.对数据进行排序实例演示sort_values()方法用于根据指定列或索引对数据进行排序。它能够对一列或多列的数据按升序或降序排列,默认情况下为升序。In:df.sort_values(by=['年龄','体重'])#两个排序关键字,先按年龄排序,如果年龄相同则按体重排Out:姓名年龄体重2李和25760张军25671王怡30824.2数据选择与过滤4.2.3多条件联合筛选4.2.2基于条件的数据筛选4.2.1使用选择器和快速访问器4.2.1使用选择器和快速访问器1.按列访问实例演示按列访问数据框时,有以下两种语法形式:对象名['列标签']#列标签要加引号对象名.列标签#列标签不加引号对象名['列标签']:列标签作为字符串处理,引号是必要的,可以处理任意字符的列标签。对象名.列标签:这是通过数据框的属性访问列。引号不需要,这种方式对列标签的要求较严格,不能有空格、特殊字符,且不能与已有的方法或属性重名。In:df['平安科技']Out:2024-0145.22024-0247.12024-0346.52024-0449.8Name:平安科技,dtype:float64In:df.南方通信Out:2024-0131.92024-0227.32024-0325.22024-0424.5Name:南方通信,dtype:float644.2.1使用选择器和快速访问器1.按列访问实例演示访问一列后,如果还要继续访问其中的一个元素,则按照访问序列对象的方法,如:对象名['列标签']['行标签']

#注意:列标签在前,行标签在后In:df["平安科技"]['2024-02']Out:47.14.2.1使用选择器和快速访问器1.按列访问实例演示数据框按列访问不支持切片,但是支持索引标签切片,语法格式为:对象名[['列标签',…]]:In:df[['平安科技','幸福银行']]Out:平安科技幸福银行2024-0145.23.42024-0247.14.62024-0346.55.22024-0449.86.84.2.1使用选择器和快速访问器2.按行访问实例演示按行访问需要用选择器loc和iloc,有多种形式,如表4-1所示。loc通过标签来进行数据访问iloc通过整数索引来进行数据访问In:df.loc['2024-01']Out:平安科技45.2南方通信31.9幸福银行3.4Name:2024-01,dtype:float64In:df.iloc[1]Out:平安科技47.1南方通信27.3幸福银行4.6Name:2024-02,dtype:float644.2.1使用选择器和快速访问器2.按行访问实例演示访问一行后,如果还要继续访问其中的一个元素,则按照访问序列对象的方法,如:对象名.loc['行标签']['列标签']#注意:行标签在前,列标签在后对象名.iloc[行索引][列索引]#行索引在前,列索引在后In:df.loc['2024-01']['平安科技']Out:45.24.2.1使用选择器和快速访问器3.切片实例演示使用选择器loc按行对数据框切片按行索引切片In:df.loc['2024-01':'2024-02']Out:平安科技南方通信幸福银行2024-0145.231.93.42024-0247.127.34.6#切片结果包含结束标签In:df.iloc[0:2]Out:平安科技南方通信幸福银行2024-0145.231.93.42024-0247.127.34.64.2.1使用选择器和快速访问器3.切片实例演示同时按行索引、列索引切片有几种变化的情况。(1)行、列同时切片。In:df.iloc[0:2,0:2]Out:平安科技南方通信2024-0145.231.92024-0247.127.3切前2行和前2列交叉处的数据块。4.2.1使用选择器和快速访问器3.切片实例演示同时按行索引、列索引切片有几种变化的情况。(1)行、列同时切片。(2)仅按列切片。只切前面两列的数据。In:df.iloc[:,0:2]Out:平安科技南方通信2024-0145.231.92024-0247.127.32024-0346.525.22024-0449.824.54.2.1使用选择器和快速访问器3.切片实例演示同时按行索引、列索引切片有几种变化的情况。(1)行、列同时切片。(2)仅按列切片。(3)访问单个元素。访问行、列索引分别为1、2的元素。In:df.iloc[1,2]Out:4.64.2.1使用选择器和快速访问器3.切片实例演示同时按行索引、列索引切片有几种变化的情况。(1)行、列同时切片。(2)仅按列切片。(3)访问单个元素。快速访问器at[]和iat[]用于快速取出单个元素,功能与loc和iloc类似,但是,只访问单个元素,性能得到优化,速度更快。at[]通过行和列的标签来获取元素。In:df.at['2024-02','平安科技']#行标签在前,列标签在后Out:47.1iat[]通过整数位置来访问单个元素。In:df.iat[0,2]#行索引在前,列索引在后Out:3.44.2.2基于条件的数据筛选1.布尔索引实例演示序列和数据框都支持布尔索引,使用一个布尔值列表或序列对象来选择对应位置为True的元素,在数据框中是选择对应的行,语法格式为:对象[[True,False,…]]#对象是序列对象,或者数据框对象,外层括号中可以是一个列表,也可以是一个序列对象,只要其中是布尔值。In:close[[True,False,False]]Out:平安科技44.3In:df[[True,False,True,False]]Out:平安科技南方通信幸福银行2024-0145.231.93.42024-0346.525.25.24.2.2基于条件的数据筛选2.关系运算实例演示序列对象可以进行关系运算,其结果是序列对象,元素值为布尔值。In:close>20Out:平安科技True南方通信True幸福银行Falsedtype:bool4.2.2基于条件的数据筛选2.关系运算实例演示数据框选择一列后也可以进行关系运算,其结果是序列对象,元素值为布尔值。In:df['平安科技']>47Out:2024-01False2024-02True2024-03False2024-04TrueName:平安科技,dtype:bool4.2.2基于条件的数据筛选3.基于条件的数据筛选实例演示把关系运算看作一个条件,可以直接把序列和数据框关系运算和布尔索引结合起来,形成基于条件的数据筛选。In:close[close>20]Out:平安科技44.3南方通信22.6In:df[df['平安科技']>47]Out:平安科技南方通信幸福银行2024-0247.127.34.62024-0449.824.56.84.2.3多条件联合筛选多条件的数据筛选实例演示当筛选条件多于一个时,可以通过逻辑运算符&(与)、|(或)进行组合,形成多条件联合筛选。In:close[(close>20)&(close<40)]#每个条件都要用圆括号Out:南方通信22.6In:df[(df['平安科技']>47)&(df['南方通信']>26)]Out:平安科技南方通信幸福银行2024-0247.127.34.64.3数据分组与聚合4.3.3分组后的数据转换4.3.2对分组数据进行聚合操作4.3.1数据分组4.3数据分组与聚合根据一个或多个列的值,将数据分为若干组。然后对每组数据进行聚合操作,如汇总、统计、计算等操作。groupby()方法分组的列标签功能实现参数示例数据姓名分区一季度二季度三季度四季度0赵四天河25723291438826721钱多黄埔28453161372336632孙冰越秀21003371390130243李萌黄埔44833810107023124周金天河41092322305640665吴达天河24354863157619346郑华黄埔46631831145134567王军越秀4839121436392649生成示例数据代码In:df=DataFrame({'姓名':['赵四','钱多','孙冰','李萌','周金','吴达','郑华','王军'],'分区':['天河','黄埔','越秀','黄埔','天河','天河','黄埔','越秀'],'一季度':[2572,2845,2100,4483,4109,2435,4663,4839],'二季度':[3291,3161,3371,3810,2322,4863,1831,1214],'三季度':[4388,3723,3901,1070,3056,1576,1451,3639],'四季度':[2672,3663,3024,2312,4066,1934,3456,2649]})4.3.1数据分组1.分组实例演示数据分组由数据框对象的groupby()方法完成,参数为分组的列标签,生成一个分组对象,如按照“分区”分组的方法:In:group=df.groupby('分区')4.3.1数据分组2.查看分组实例演示生成一个分组对象,通过该对象可以查看分组情况。In:group.ngroups#ngroups为分组对象的属性Out:3#数据框被分成了3组从结果可以看出,所有数据按照分区被分成了3组。4.3.1数据分组2.查看分组实例演示生成一个分组对象,通过该对象可以查看分组情况。In:group.size()#查看各分组的数量Out:分区天河3越秀2黄埔34.3.1数据分组2.查看分组实例演示生成一个分组对象,通过该对象可以查看分组情况。In:forname,gingroup:#遍历各分组 print("分组名:",name) print(g)分组名:天河姓名分区一季度二季度三季度四季度0赵四天河25723291438826724周金天河41092322305640665吴达天河2435486315761934分组名:越秀姓名分区一季度二季度三季度四季度2孙冰越秀21003371390130247王军越秀4839121436392649分组名:黄埔姓名分区一季度二季度三季度四季度1钱多黄埔28453161372336633李萌黄埔44833810107023126郑华黄埔46631831145134564.3.2对分组数据进行聚合操作聚合操作可以将每个组的数据进行汇总、计算等,从而提取有用的信息。实现:agg方法聚合操作以及对应的函数名称为:求和(sum)、计数(count)、平均值(mean)、最大值(max)、最小值(min)等。4.3.2对分组数据进行聚合操作实例演示(1)对一个列标签执行一种聚合In:group.agg({'一季度':'sum'})#参数是一个字典,列标签是键,操作名是值Out:一季度分区天河9116#结果代表天河区所有人的总和越秀6939黄埔1199114.3.2对分组数据进行聚合操作实例演示(2)对一个列标签执行多种聚合In:group.agg({'一季度':['sum','max']})#参数是操作名列表Out:一季度 summax分区天河91164109越秀69394839黄埔11991466324.3.2对分组数据进行聚合操作实例演示(3)对多个列标签执行多种聚合In:group.agg({'一季度':['sum','max'],'二季度':['mean','min']})#每个列标签和操作构成一个键值对Out:一季度二季度 summaxmeanmin分区天河911641093492.02322越秀693948392292.51214黄埔1199146632934.0183134.3.3分组后的数据转换实例演示用groupby()对数据进行分组后,还可以通过数据转换来修改或生成新的数据。实现transform()函数参数操作名字符串功能将操作应用到每一个分组,转换后返回返回一个序列In:group['四季度'].transform('mean')#计算各区四季度的平均值。Out:02890.666667#表示天河区四季度的平均值13143.66666722836.50000033143.66666742890.66666752890.66666763143.66666772836.500000Name:四季度,dtype:float64transform()函数“每个分组数据在转换后会被应用回原始DataFrame的相应位置”意思是标签0、4、5对应的值为四季度天河区的平均值4.4合并和连接4.4.3数据框连接4.4.2合并方式4.4.1数据框合并4.4.1数据框合并实例演示merge()用来合并两个数据框。参数on指定合并关键字。In:yu=pd.DataFrame({'学号':['201','202','203'],'语文':[91,82,93]})shu=pd.DataFrame({'学号':['203','202','201'],'数学':[94,85,96]})cheng=pd.merge(yu,shu,on='学号')chengOut:学号语文数学020191961202828522039394merge()方法

merge()函数将两个数据框yu和shu按照学号列进行合并,生成一个新的数据框。数据框yu和shu中,学号列的顺序可以不同,pandas能够自动对齐。4.4.2合并方式实例演示merge()方法用来将两个数据框合并成一个。使用merge()合并时,它的一个重要参数是how,它决定了数据框合并的类型。1.内连接内连接只保留两个数据框中共同键值的行。也就是说,只有当两个数据框的键值匹配时,才会在结果中显示这行数据。how的值为inner,这也是默认值。In:yu=pd.DataFrame({'学号':['201','202','203'],'语文':[91,82,93]})shu=pd.DataFrame({'学号':['204','202','201'],'数学':[94,85,96]})cheng=pd.merge(yu,shu,on='学号',how='inner')chengOut:学号语文数学02019196120282851.内连接

只有两个数据框中都出现的学号201和202才出现在合并后的数据框中。4.4.2合并方式实例演示2.左连接左连接保留左侧数据框中的所有行,右侧数据框只有与左侧匹配的行会出现在结果中。如果没有匹配,则右侧的数据用NaN填充。how的值为left。In:cheng=pd.merge(yu,shu,on='学号',how='left')chengOut:学号语文数学02019196.012028285.0220393NaN2.左连接

保留数据框yu中的所有行,203号没有数学成绩,用NaN填充。4.4.2合并方式实例演示3.右连接右连接与左连接相反,它保留右侧数据框的所有行,左侧数据框只有匹配的行会出现在结果中。如果没有匹配,则左侧的数据用NaN填充。how的值为right。In:cheng=pd.merge(yu,shu,on='学号',how='right')chengOut:学号语文数学0204NaN94120282.085220191.0963.右连接

保留数据框shu中的所有行,204号没有语文成绩,用NaN填充。4.4.2合并方式实例演示4.外连接外连接保留两个数据框中的所有行,缺少匹配的数据会用NaN填充。这种方式合并所有键的值,不管是否匹配。how的值为outer。In:cheng=pd.merge(yu,shu,on='学号',how='outer')chengOut:学号语文数学020191.096.0120282.085.0220393.0NaN3204NaN94.04.外连接

203号没有数学成绩,204号没有语文成绩,均以NaN填充。4.4.3数据框连接实例演示concat()方法用于连接多个数据框。例如,数据框df1表示一个班的部分同学的语文和数学成绩,df2表示另一部分同学的成绩,现在需要将它们连接成一个数据框。参数ignore_index=True用于重建索引。In:df1=pd.DataFrame({'学号':['201','202','203'],'语文':[91,82,93],'数学':[94,85,96]})df2=pd.DataFrame({'学号':['204','205','206'],'语文':[95,87,83],'数学':[84,75,91]})cheng=pd.concat([df1,df2],ignore_index=True)chengOut:学号语文数学020191941202828522039396320495844205877552068391concat()方法

4.5数据读取和存储4.5.2读写Excel文件4.5.1读写CSV文件4.5.1读写CSV文件实例演示CSV(Comma-SeparatedValues,逗号分隔值)是一种常见的用于存储表格数据的纯文本格式。使用to_csv()和read_csv()函数可以实现CSV文件的存取。to_csv()是数据框的成员,要通过数据框对象调用。In:data=[[800,750,500],[700,800,600],[680,720,580]]col=['会计','保险','外语']ind=['2022','2023','2024']df=DataFrame(data,columns=col,index=ind)df.to_csv('renshu.csv',index=True)1.to_csv()方法

4.5.1读写CSV文件实例演示CSV(Comma-SeparatedValues,逗号分隔值)是一种常见的用于存储表格数据的纯文本格式。使用to_csv()和read_csv()函数可以实现CSV文件的存取。to_csv()是数据框的成员,要通过数据框对象调用。1.to_csv()方法

index=True指示保存索引,renshu.csv文件内容显示如下,会计,保险,外语2022,800,750,5002023,700,800,6002024,680,720,580index=False指示不保存索引,则renshu.csv文件内容更改为如下会计,保险,外语800,750,500700,800,600680,720,58004.5.1读写CSV文件实例演示CSV文件默认时用逗号分隔数据,也可以用sep参数指定其他的分隔符。1.to_csv()方法

In:df.to_csv('renshu.csv',index=True,sep='\t')sep='\t'指示用制表符作为数据分隔符,renshu.csv文件内容如下 会计 保险 外语2022 800 750 5002023 700 800 6002024 680 720 5804.5.1读写CSV文件实例演示read_csv()是pandas的成员,要通过pandas调用。read_csv()函数可以将CSV文件读取为DataFrame对象。Pandas默认使用UTF-8编码。如果文件是用pandas的to_csv写的,则用read_csv读取的时候不用指定编码。如果文件是别的方式创建的,则用read_csv读取的时候需要指定创建时的编码,否则会出现中文乱码。2.read_csv方法

In:df=pd.read_csv('renshu.csv',index_col=0,sep='\t')根据文件内容设置参数index_col和sep,如果文件第一列是索引,则设置参数index_col,否则不设置。根据文件的分隔符设置参数sep。4.5.2读写Excel文件实例演示to_excel()和read_excel()函数实现Excel文件的存取。to_excel()是数据框的成员,要通过数据框对象调用。1.to_excel()方法

In:df.to_excel('renshu.xlsx',index=True)参数index=True指定需要保存索引。如果不需要保存索引,则设置index=False。保存结果如图4-1所示。4.5.2读写Excel文件实例演示函数to_excel保存的默认工作表的名称是Sheet1,可以通过设置参数sheet_name来指定工作表的名称。1.to_excel()方法

In:df.to_excel('renshu.xlsx',sheet_name='学院',index=True)4.5.2读写Excel文件实例演示通过函数to_excel()保存的excel工作簿中只有一个工作表。如果要在一个工作簿中保存多个工作表,则要利用pandas的ExcelWriter对象。1.to_excel()方法

frompandasimportExcelWriterwithExcelWriter('workbook.xlsx')aswriter:df1.to_excel(writer,sheet_name='表1')df1.to_excel(writer,sheet_name='表2')如要将两个数据框对象df1和df2写入一个工作簿workbook.xlsx,工作表名分别时表1和表2,则示例代码如下4.5.2读写Excel文件实例演示read_excel()是pandas的成员,要通过pandas调用。read_excel()用于读取Excel文件。参数sheet_name用于指定工作表名称,如果读取工作簿的第一个工作表,也可以不设置该参数。如果工作表包含索引,则设置参数index_col,否则不设置该参数。2.read_excel方法

In:df=pd.read_excel('renshu.xlsx',sheet_name='学院',index_col=0)4.6数据清洗和预处理4.6.1缺失值检测与处理4.6.2异常值检测与处理4.6.3重复值检测与处理4.6.4数据类型转换4.6.1缺失值检测与处理实例演示isna()或isnull()方法用来检测缺失值,返回一个布尔型的DataFrame,标识数据中哪些位置有缺失值。1.检测缺失值

In:a=np.array([[163,113,158],[np.nan,np.nan,119],[193,127,np.nan],[109,126,110]])df=DataFrame(a,index=['一月','二月','三月','四月'],columns=['美好集团','北方通信','广东科技'])df.isna()#df.isnull()两个函数的输出结果相同Out:美好集团北方通信广东科技一月FalseFalseFalse二月TrueTrueFalse三月FalseFalseTrue四月FalseFalseFalseTrue对应的位置有缺失值4.6.1缺失值检测与处理实例演示处理缺失值的方式取决于数据分析的需求。常用的方法包括使用dropna()删除包含缺失值的行或列2.处理缺失值

In:df.dropna()#删除有缺失值的行,并返回一个新数据框Out:美好集团北方通信广东科技一月163.0113.0158.0四月109.0126.0110.04.6.1缺失值检测与处理实例演示处理缺失值的方式取决于数据分析的需求。常用的方法包括fillna()用特定值(如均值、中位数或前后值)填充缺失值2.处理缺失值

In:df.fillna(0)Out:美好集团北方通信广东科技一月163.0113.0158.0二月0.00.0119.0三月193.0127.00.0四月109.0126.0110.0用0值填充缺失值。4.6.1缺失值检测与处理实例演示处理缺失值的方式取决于数据分析的需求。常用的方法包括fillna()用特定值(如均值、中位数或前后值)填充缺失值2.处理缺失值

In:df.fillna(method='ffill')Out:美好集团北方通信广东科技一月163.0113.0158.0二月163.0113.0119.0三月193.0127.0119.0四月109.0126.0110.0用缺失值前面的值填充。参数method='bfill'指定用后面的值填充缺失值。4.6.1缺失值检测与处理实例演示处理缺失值的方式取决于数据分析的需求。常用的方法包括fillna()用特定值(如均值、中位数或前后值)填充缺失值2.处理缺失值

In:df.fillna(value=df.mean())Out:美好集团北方通信广东科技一月163.0113.0158.0二月155.0122.0119.0三月193.0127.0129.0四月109.0126.0110.0用所在列的平均值填充缺失值。4.6.2异常值检测与处理2.quantile()函数异常值是指数据中偏离正常范围的极端值,可能是由于测量错误、数据录入错误或其他原因导致的。这些异常值如果不加以处理,可能会影响计算的准确性和分析结果。1.异常值及其计算

第一分位数Q1第三分位数Q3IQR=Q3-Q1异常值小于Q1-1.5*IQR或大于Q3+1.5*IQRquantile()函数用于计算数据的分位数。分位数是将数据按指定百分比划分的值,用于分析数据的分布情况。通过quantile()函数,可以计算出25%、75%等常用的分位数。25%和75%分位数分别称为第一和第三四分位数。第一分位数Q1第三分位数Q3实例演示data=pd.Series([10,12,15,20,100,25,30,200])#1.计算四分位数范围(IQR)Q1=data.quantile(0.25)Q3=data.quantile(0.75)IQR=Q3-Q1#2.识别异常值lower_bound=Q1-1.5*IQRupper_bound=Q3+1.5*IQRoutliers=(data<lower_bound)|(data>upper_bound)#3.计算均值(不包含异常值)mean_value=data[~outliers].mean()#4.用均值替换异常值data[outliers]=mean_valueprint("处理后的数据:")print(data)【例4-1】编写程序识别序列对象的异常值,并用均值替代异常值。4.6.3重复值检测与处理重复值检测与处理是数据清洗的一个重要步骤。通过检测并处理数据中的重复值,可以保证数据的完整性和准确性,避免冗余数据影响分析结果。duplicated()函数用于检测数据中的重复值。该函数会返回一个布尔类型的序列对象,指示每一行是否为重复行。通常情况下,保留第一次出现的值,后续重复的值会标记为True。1.检测重复值

实例演示In:data={'A':[1,2,2,3],'B':[4,5,5,6]}df=DataFrame(data)df.duplicated()Out:0False1False2True#这一行被标记为重复行3False4.6.3重复值检测与处理drop_duplicates()函数用于删除重复值。可选择保留第一行或最后一行。2.删除重复值

实例演示In:df.drop_duplicates(keep='first')Out:AB014125#保留第一行,重复行数据相同,序号不同336In:df.drop_duplicates(keep='last')Out:AB014225#保留最后一行3364.6.4数据类型转换因为不同的分析方法需要特定的数据类型,数据类型转换是处理和清洗数据的常见操作。通常采用astype()方法,可以将序列、数据框指定列转或者数据框对象换为指定的数据类型。astype()方法转换数据类型

实例演示In:a=np.array([[163,113,132],[175,129,119],[193,127,125],[189,126,110]])df=DataFrame(a,index=['一月','二月','三月','四月'],columns=['美好集团','北方通信','广东科技'])将数据框的所有列都转换成目标数据类型。In:df.astype('float32')Out:美好集团北方通信广东科技一月163.0113.0132.0二月175.0129.0119.0三月193.0127.0125.0四月189.0126.0110.04.6.4数据类型转换因为不同的分析方法需要特定的数据类型,数据类型转换是处理和清洗数据的常见操作。通常采用astype()方法,可以将序列、数据框指定列转或者数据框对象换为指定的数据类型。astype()方法转换数据类型

实例演示只转换数据框的一列,生成一个新的序列对象。In:df['北方通信'].astype('float32')Out:一月113.0二月129.0三月127.0四月126.0Name:北方通信,dtype:float32以下命令可以将新生成的对象写入原始对象。In:df['北方通信']=df['北方通信'].astype('float32')4.7时间序列处理时间序列数据是指按时间顺序排列的数据,通常用于表示金融市场数据、传感器数据、气象数据等。数据框常以时间作为行标签保存时间序列数据。4.7时间序列处理时间序列生成与索引设置4.7.1时间序列数据分析4.7.5时间间隔计算与转换4.7.2移动窗口计算4.7.4时间序列数据重采样4.7.34.7.1时间序列生成与索引设置date_range()函数可以快速生成规则的时间序列。例如,可以生成按天、按月、按年等递增的时间序列。参数start指定起始日期,periods指定周期数,freq指定频率,D、M、Y分别表示天、月、年。1.date_range()函数

实例演示In:dates=pd.date_range(start='2024-01-01',periods=10,freq='D')datesOut:DatetimeIndex(['2024-01-01','2024-01-02','2024-01-03','2024-01-04','2024-01-05','2024-01-06','2024-01-07','2024-01-08','2024-01-09','2024-01-10'],dtype='datetime64[ns]',freq='D')以下代码可以生成10天的日期序列。4.7.1时间序列生成与索引设置date_range()函数可以快速生成规则的时间序列。例如,可以生成按天、按月、按年等递增的时间序列。参数start指定起始日期,periods指定周期数,freq指定频率,D、M、Y分别表示天、月、年。1.date_range()函数

实例演示In:dates=pd.date_range(start='2024-01-01',periods=10,freq='M')datesOut:DatetimeIndex(['2024-01-31','2024-02-29','2024-03-31','2024-04-30','2024-05-31','2024-06-30','2024-07-31','2024-08-31','2024-09-30','2024-10-31'],dtype='datetime64[ns]',freq='M')以下代码可以生成10月的日期序列,每个日期对齐到月末日期。4.7.1时间序列生成与索引设置date_range()函数生成的对象是一个可迭代对象,可以通过索引访问其中的每一个元素,元素是一个Timestamp对象。2.访问Timestamp对象

实例演示In:dates[0]Out:Timestamp('2024-01-3100:00:00',freq='M')4.7.1时间序列生成与索引设置在时间序列处理中,通常将日期或时间列设置为索引,以便更好地操作、查询、切片时间序列数据。如果数据中有日期时间列,但是以字符串的形式存储,首先可以使用pd.to_datetime()函数将其转换为datetime格式,然后通过set_index()设置该列为索引。3.将日期或时间列设置为索引

实例演示In:date=['2024-8-1','2024-8-2','2024-8-3','2024-8-4','2024-8-5','2024-8-6','2024-8-7','2024-8-8','2024-8-9','2024-8-10']num=np.random.randint(50,100,size=(10))df=DataFrame({'日期':date,'数量':num})dfOut:日期数量02024-8-181#数据框中有字符串形式的日期数据12024-8-27322024-8-36232024-8-45042024-8-58052024-8-69962024-8-78972024-8-85482024-8-96392024-8-10784.7.1时间序列生成与索引设置在时间序列处理中,通常将日期或时间列设置为索引,以便更好地操作、查询、切片时间序列数据。如果数据中有日期时间列,但是以字符串的形式存储,首先可以使用pd.to_datetime()函数将其转换为datetime格式,然后通过set_index()设置该列为索引。3.将日期或时间列设置为索引

实例演示In:df['日期']=pd.to_datetime(df['日期'])#将'date'列转换为时间类型df.set_index('日期',inplace=True)dfOut:日期数量

2024-08-0165#日期数据被设置成索引列2024-08-02852024-08-03972024-08-04932024-08-05842024-08-06512024-08-07722024-08-08922024-08-09802024-08-10554.7.1时间序列生成与索引设置可以在创建DataFrame时直接将pd.date_range()生成的日期序列作为索引。3.将日期或时间列设置为索引

实例演示In:dates=pd.date_range(start='2024-08-01',periods=10,freq='D')num=np.random.randint(50,100,size=(10))df=pd.DataFrame(num,index=dates,columns=['数量'])dfOut:数量2024-08-01762024-08-02852024-08-03952024-08-04962024-08-05912024-08-06832024-08-07902024-08-08772024-08-09862024-08-10604.7.2时间间隔计算与转换时间间隔计算通常涉及两个时间点或两个时间序列之间的差异。pandas使用Timedelta对象来表示时间间隔。如果有两个时间点,可以直接使用减法运算来计算它们之间的时间差,结果是一个Timedelta对象。1.时间间隔计算

实例演示In:start=pd.Timestamp('2024-08-0108:00')end=pd.Timestamp('2024-08-3108:00')diff=end–starttype(diff)Out:pandas._libs.tslibs.timedeltas.TimedeltaIn:diffOut:Timedelta('30days00:00:00')#两个日期之间相隔30天4.7.2时间间隔计算与转换对于整个时间序列,也可以通过类似的减法运算计算出每个时间点之间的差异。1.时间间隔计算

实例演示In:times=pd.Series(pd.date_range('2024-01-01',periods=5,freq='M'))diffs=times.diff()#diffs是一个序列,每个点与前一个的差diffsOut:0NaT129days231days330days431days4.7.2时间间隔计算与转换时间间隔可以转换为不同的时间单位,如天、小时、分钟或秒等。Timedelta对象支持直接访问特定单位的时间差。2.时间间隔转换

实例演示In:start=pd.Timestamp('2024-09-0108:00:00')end=pd.Timestamp('2024-09-0309:10:10')diff=end-startdiff.days#获取时间差包含的天数Out:2In:diff.seconds#时间差中除了天数剩余时间包含的秒数,通过计算可以得到小时数和分钟数Out:4210In:diff.total_seconds()#函数调用,返回时间差包含的总秒数Out[86]:177010.04.7.3时间序列数据重采样resample用于对时间序列数据进行重采样。通过resample,可以根据指定的时间频率对数据进行聚合、填充、插值等操作。

温馨提示

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

评论

0/150

提交评论