《(9)--第7章 pandas数据分析实战.ppt》由会员分享,可在线阅读,更多相关《(9)--第7章 pandas数据分析实战.ppt(32页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第7章 pandas数据分析实战1本章学习目标熟练掌握pandas一维数组Series结构的使用熟练掌握pandas时间序列对象的使用熟练掌握pandas二维数组DataFrame结构的创建熟练掌握pandas读取Excel文件中数据的方法熟练掌握DataFrame结构中数据的选择与查看熟练掌握查看DataFrame结构中数据特征的方法熟练掌握DataFrame结构的排序方法熟练掌握DataFrame结构中数据的分组和聚合方法熟练掌握DataFrame结构中异常值的查看与处理熟练掌握DataFrame结构中缺失值的查看与处理熟练掌握DataFrame结构中重复值的查看与处理熟练掌握DataFr
2、ame结构中数据差分的使用熟练掌握pandas提供的透视表与交叉表技术熟练掌握DataFrame结构中数据的重采样技术7.1 pandas常用数据类型扩展库pandas是基于扩展库numpy和matplotlib的数据分析模块,是一个开源项目,提供了大量标准数据模型和高效操作大型数据集所需要的功能,可以说pandas是使得Python能够成为高效且强大的数据分析行业首选语言的重要因素之一。扩展库pandas常用的数据结构有:1)Series,带标签的一维数组;2)DatetimeIndex,时间序列;3)DataFrame,带标签且大小可变的二维表格结构;4)Panel,带标签且大小可变的三维
3、数组。7.1.1 一维数组与常用操作Series是pandas提供的一维数组,由索引和值两部分组成,是一个类似于字典的结构。其中值的类型可以不同,如果在创建时没有明确指定索引则会自动使用从0开始的非负整数作为索引。源码见配套资源。7.1.2 时间序列与常用操作时间序列对象一般使用pandas的date_range()函数生成,可以指定日期时间的起始和结束范围、时间间隔以及数据数量等参数,语法为:date_range(start=None,end=None,periods=None,freq=D,tz=None,normalize=False,name=None,closed=None,*kwa
4、rgs)其中参数start和end分别用来指定起止日期时间;参数periods用来指定要生成的数据数量;参数freq用来指定时间间隔,默认为D,表示相邻两个日期之间相差一天,更多取值和含义见http:/pandas.pydata.org/pandas-docs/stable/user_guide/timeseries.html#timeseries-offset-aliases。另外,pandas的Timestamp类也支持很多日期时间有关的操作。源码见配套资源。7.1.3 二维数组DataFrame源码见配套资源。7.2 DataFrame数据处理与分析实战7.2.1 读取Excel文件中的
5、数据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,true_values=None,false_values=None,engine=None,squeeze=False,*kwds)1)参数i
6、o用来指定要读取的Excel文件,可以是字符串形式的文件路径、url或文件对象;2)参数sheetname用来指定要读取的worksheet,可以是表示worksheet序号的整数或表示worksheet名字的字符串,如果要同时读取多个worksheet可以使用形如0,1,sheet3的列表,如果指定该参数为None则表示读取所有worksheet并返回包含多个DataFrame结构的字典,该参数默认为0(表示读取第一个worksheet中的数据);3)参数headers用来指定worksheet中表示表头或列名的行索引,默认为0,如果没有作为表头的行,必须显式指定headers=None;4
7、)参数skiprows用来指定要跳过的行索引组成的列表;5)参数index_col用来指定作为DataFrame索引的列下标,可以是包含若干列下标的列表;6)参数names用来指定读取数据后使用的列名;7)参数thousands用来指定文本转换为数字时的千分符,如果Excel中有以文本形式存储的数字,可以使用该参数;8)参数usecols用来指定要读取的列的索引或名字;9)参数na_values用来指定哪些值被解释为缺失值。7.2.1 读取Excel文件中的数据import pandas as pd#设置列对齐pd.set_option(display.unicode.ambiguous_as
8、_wide,True)pd.set_option(display.unicode.east_asian_width,True)#读取工号、姓名、时段、交易额这四列数据,使用默认索引df=pd.read_excel(rC:Python36超市营业额2.xlsx,usecols=工号,姓名,时段,交易额)#输出前10行数据print(df:10,end=nn)#读取第一个worksheet中所有列#跳过第1、3、5行,指定下标为1的列中数据为DataFrame的行索引标签df=pd.read_excel(rC:Python36超市营业额2.xlsx,skiprows=1,3,5,index_col
9、=1)print(df:10)7.2.2 筛选符合特定条件的数据除了使用下标访问指定列的数据以及使用切片访问指定行的数据,还可以使用布尔数组作为下标指定访问符合特定条件的数据。另外,DataFrame结构还提供了loc、iloc、at、iat等访问器来访问指定的数据。其中,iloc和iat使用整数来指定行、列的下标,而loc和at使用标签指定要访问的行和列。源码见配套资源。7.2.3 查看数据特征和统计信息源码见配套资源。7.2.4 按不同标准对数据排序sort_index(axis=0,level=None,ascending=True,inplace=False,kind=quicksor
10、t,na_position=last,sort_remaining=True,by=None)参数axis=0时表示根据行索引标签进行排序,axis=1时表示根据列名进行排序;参数ascending=True表示升序排序,ascending=False表示降序排序;参数inplace=True时表示原地排序,inplace=False表示返回一个新的DataFrame。sort_values(by,axis=0,ascending=True,inplace=False,kind=quicksort,na_position=last)参数by用来指定依据哪个或哪些名字的列进行排序,如果只有一列则
11、直接写出列名,多列的话需要放到列表中;参数ascending=True表示升序排序,ascending=False表示降序排序,如果ascending设置为包含若干True/False的列表(必须与by指定的列表长度相等),可以为不同的列指定不同的顺序;参数na_position用来指定把缺失值放在最前面(na_position=first)还是最后面(na_position=last)。源码见配套资源。7.2.5 使用分组与聚合对员工业绩进行汇总groupby(by=None,axis=0,level=None,as_index=True,sort=True,group_keys=True,
12、squeeze=False,*kwargs)参数by用来指定作用于index的函数、字典、Series对象,或者指定列名作为分组依据;参数as_index=False时用来分组的列中的数据不作为结果DataFrame对象的index;参数squeeze=True时会在可能的情况下降低结果对象的维度。源码见配套资源。7.2.6 处理超市交易数据中的异常值异常值是指严重超出正常范围的数值,这样的数据一般是数据采集错误或类似原因引起的。在数据分析时,需要把这些数据删除或替换为特定的值(例如人为设定的正常范围边界值),减小对最终数据分析结果的影响。异常值处理的关键是根据实际情况准确定义正常范围边界值,
13、超出正常范围的数值认为是异常值。源码见配套资源。7.2.7 处理超市交易数据中的缺失值dropna(axis=0,how=any,thresh=None,subset=None,inplace=False)参数how=any时表示只要某行包含缺失值就丢弃,how=all时表示某行全部为缺失值才丢弃;参数thresh用来指定保留包含几个非缺失值数据的行;参数subset用来指定在判断缺失值时只考虑哪些列。7.2.7 处理超市交易数据中的缺失值fillna(value=None,method=None,axis=None,inplace=False,limit=None,downcast=None
14、,*kwargs)参数value用来指定要替换的值,可以是标量、字典、Series或DataFrame;参数method用来指定填充缺失值的方式,值为pad或ffill时表示使用扫描过程中遇到的最后一个有效值一直填充到下一个有效值,值为backfill或bfill时表示使用缺失值之后遇到的第一个有效值填充前面遇到的所有连续缺失值;参数limit用来指定设置了参数method时最多填充多少个连续的缺失值;参数inplace=True时表示原地替换,inplace=False时返回一个新的DataFrame对象而不对原来的DataFrame做任何修改。源码见配套资源。7.2.8 处理超市交易数据中
15、的重复值duplicated(subset=None,keep=first)参数subset用来指定判断不同行的数据是否重复时所依据的一列或多列,默认使用整行所有列的数据进行比较;参数keep=first时表示重复数据的第一次出现标记为False,keep=last时表示重复数据的最后一次出现标记为False,keep=False时表示标记所有重复数据为True。drop_duplicates(subset=None,keep=first,inplace=False)参数subset和keep的含义与duplicated()方法类似;参数inplace=True时表示原地修改,此时duplic
16、ated()方法没有返回值,inplace=False时表示返回新的DataFrame结构而不对原来的DataFrame做任何修改。源码见配套资源。7.2.9 使用数据差分查看员工业绩波动情况diff(periods=1,axis=0)参数periods用来指定差分的跨度,当periods=1且axis=0时表示每一行数据减去紧邻的上一行数据,当periods=2且axis=0时表示每一行减去上面第二行的数据;参数axis=0时表示按行进行纵向差分,axis=1时表示按列横向差分。源码见配套资源。7.2.10 使用透视表与交叉表查看业绩汇总数据(1)透视表透视表用来根据一个或多个键进行聚合,把
17、数据分散到对应的行和列上去,是数据分析常用技术之一。pivot(index=None,columns=None,values=None)参数index用来指定使用哪一列数据作为结果DataFrame的索引;参数columns用来指定哪一列数据作为结果DataFrame的列名;参数values用来指定哪一列数据作为结果DataFrame的值。7.2.10 使用透视表与交叉表查看业绩汇总数据pivot_table(values=None,index=None,columns=None,aggfunc=mean,fill_value=None,margins=False,dropna=True,ma
18、rgins_name=All)参数values、index、columns的含义与DataFrame结构的pivot()方法一样;参数aggfunc用来指定数据的聚合方式,例如求平均、求和、求中值等;参数fill_value用来指定把透视表中的缺失值替换为什么值;参数margins用来指定是否显示边界以及边界上的数据;参数margins_name用来指定边界数据的索引名称和列名;参数dropna用来指定是否丢弃缺失值。源码见配套资源。7.2.10 使用透视表与交叉表查看业绩汇总数据(2)交叉表交叉表是一种特殊的透视表,往往用来统计频次,也可以使用参数aggfunc指定聚合函数实现其他功能。cr
19、osstab(index,columns,values=None,rownames=None,colnames=None,aggfunc=None,margins=False,dropna=True,normalize=False)参数values、index、columns的含义与DataFrame结构的pivot()方法一样;参数aggfunc用来指定聚合函数,默认为统计次数;参数rownames和colnames分别用来指定行索引和列索引的名字,如果不指定则直接使用参数index和columns指定的列名。源码见配套资源。7.2.11 使用重采样技术按时间段查看员工业绩resample(
20、rule,how=None,axis=0,fill_method=None,closed=None,label=None,convention=start,kind=None,loffset=None,limit=None,base=0,on=None,level=None)参数rule用来指定重采样的时间间隔,例如7D表示每7天采样一次;参数how用来指定如何处理两个采样时间之间的数据,不过该参数很快会被新版本丢弃不用了;参数label=left表示使用采样周期的起始时间作为结果DataFrame的index,label=right表示使用采样周期的结束时间作为结果DataFrame的ind
21、ex;参数on用来指定根据哪一列进行重采样,要求该列数据为日期时间类型。源码见配套资源。7.2.12 多索引相关技术与操作DataFrame结构支持多个索引,既可以在读取数据时使用index_col指定多列,也可以通过groupby()方法分组时指定多个索引。对于含有多个索引的DataFrame结构,在使用sort_index()方法按索引排序、使用groupby()方法进行分组时,都可以使用参数level指定按哪一级索引进行排序或分组。源码见配套资源。7.2.13 使用标准差与协方差分析员工业绩7.2.13 使用标准差与协方差分析员工业绩源码见配套资源。7.2.14 使用pandas的属性接
22、口实现高级功能DataFrame数据中的日期时间列支持dt接口,该接口提供了dayofweek、dayofyear、is_leap_year、quarter、weekday_name等属性和方法,例如quarter可以直接得到每个日期分别是第几个季度,weekday_name可以直接每个日期对应的周几的名字。DataFrame数据中的字符串列支持str接口,该接口提供了center、contains、count、endswith、find、extract、lower、split等大量属性和方法。源码见配套资源。7.2.15 绘制各员工在不同柜台业绩平均值的柱状图DataFrame结构的plot
23、()方法可以直接绘制折线图、柱状图、饼状图等各种形状的图形来展示数据,绘图时会自动调用扩展库matplotlib的功能。对DataFrame结构中的数据进行可视化时,既可以直接使用plot()方法的kind参数指定图形的形状,也可以使用plot类的line()、bar()或其他方法绘制相应形状的图形。源码见配套资源。7.2.16 查看DataFrame的内存占用情况import pandas as pd#读取全部数据,使用默认索引df=pd.read_excel(rC:Python36超市营业额2.xlsx)print(交易额列占用内存情况.ljust(20,=)print(df交易额.mem
24、ory_usage()print(内存占用情况.ljust(20,=)print(df.memory_usage()print(内存占用总额.ljust(20,=)print(df.memory_usage().sum()print(使用df.info()查看内存占用.ljust(20,=)df.info()7.2.17 数据拆分与合并(1)concat()函数与append()方法根据不同的需要,可以对DataFrame使用切片或loc等运算按行或列进行拆分,得到多个DataFrame结构。扩展库pandas提供了concat()函数用于合并多个DataFrame结构,完整语法如下:conc
25、at(objs,axis=0,join=outer,join_axes=None,ignore_index=False,keys=None,levels=None,names=None,verify_integrity=False,copy=True)参数objs表示包含多个Series、DataFrame或Panel对象的序列;参数axis默认为0,表示按行进行纵向合并和扩展。仍以前面几节使用的文件C:Python36超市营业额2.xlsx为例,该文件中除了前面已经使用的包含在Sheet1中的2019年3月份交易数据,在Sheet2中还包含了2019年4月1日的交易数据,数据格式与Sheet
26、1相同。源码见配套资源。7.2.17 数据拆分与合并(2)merge()方法与join()方法merge(right,how=inner,on=None,left_on=None,right_on=None,left_index=False,right_index=False,sort=False,suffixes=(_x,_y),copy=True,indicator=False)参数right表示另一个DataFrame结构;参数how的取值可以是left、right、outer或inner之一,表示数据连接的方式;参数on用来指定连接时依据的列名或包含若干列名的列表,要求指定的列名在两个
27、DataFrame中都存在,如果没有任何参数指定连接键则根据两个DataFrame的列名交集进行连接;参数left_on和right_on分别用来指定连接时依据的左侧列名标签和右侧列名标签。7.2.17 数据拆分与合并DataFrame结构的join()方法也可以实现按列对左表(调用join()方法的DataFrame)和右表合并,如果右表other索引与左表某列的值相同可以直接连接,如果要根据右表other中某列的值与左表进行连接,需要先对右表other调用set_index()方法设定该列作为索引。join(other,on=None,how=left,lsuffix=,rsuffix=,sort=False)参数other表示另一个DataFrame结构,也就是右表;参数on用来指定连接时依据的左表列名,如果不指定则按左表索引index的值进行连接;参数how的含义与merge()方法的how相同;参数lsuffix和rsuffix用来指定列名的后缀。7.2.17 数据拆分与合并仍以前面几节使用的文件C:Python36超市营业额2.xlsx为例,该文件中除了前面已经使用的包含在Sheet1中的2019年3月份交易数据和包含在Sheet2中的2019年4月份交易数据,在Sheet3中还包含了每位员工的职级,数据格式如图所示。源码见配套资源。
限制150内