《第11章 Python数据分析.pptx》由会员分享,可在线阅读,更多相关《第11章 Python数据分析.pptx(39页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第第11章章 Python数据分析数据分析主讲主讲 夏敏捷夏敏捷计算机学院副教授计算机学院副教授Python Data Analysis Library (Pandas) Python Data Analysis Library (Pandas)是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。Pandas提供了一些标准的数据模型和大量能使我们快速便捷地处理数据的函数和方法,使Python成为大型数据集强大而高效的数据分析工具。本章就来学习Pandas操作方法。Pandas提供如下数据类型:(1)Series系列(Series)是能够保存任何类型的数据(整数,字符串,浮点数,
2、Python对象等)的一维标记数组。 (2)DataFrame数据框(DataFrame)是二维的表格型数据结构。很多功能与R中的data.frame类似。可以将DataFrame理解为Series的容器。(3)Panel面板(Panel)是三维的数组,可以理解为DataFrame的容器。11.1 Python Data Analysis Library(Pandas)2使用Pandas首先需要安装,在命令行下使用pip3 install pandas即可。Pandas 约定俗成的导入方法如下:import pandas as pdfrom pandas import Series,DataF
3、rame如果能导入成功,说明安装成功。11.1 Python Data Analysis Library(Pandas)11.1.1 Series系列1 1创建创建PandasPandas系列系列Series 就如同列表一样是一系列数据,每个数据对应一个索引值。可以看做一个定长的有序字典。s = Series(中国,美国,日本) #注意这里是默认索引0,1,2s = Series(中国,美国,日本, index = a,b,c) #自定义索引s = Series(data = 中国,美国,日本, index = a,b,c)Pandas系列可以使用以下构造函数创建:pandas.Series(
4、 data, index, dtype, copy)11.1.1 Series系列字典(dict)可以作为输入传递,如果没有指定索引则按排序顺序取得字典键以构造索引。 data = a : 100, b : 110, c : 120 s = pd.Series(data) print(s.values) #结果是 100 110 120 print(sindex) s = pd.Series(data, index=a, b, c, d)所以其结果就为NaN (即“非数字” (not a number).如果数据是标量值(常量),则必须提供索引。将重复该值以匹配索引的长度。例如: s = pd
5、.Series(5, index=0, 1, 2, 3) print(s.values) #结果是5 5 5 511.1.1 Series系列2 2访问访问PandasPandas系列系列(1)使用位置访问Pandas系列中数据s = pd.Series(1,2,3,4,5,index = a,b,c,d,e)print (s0 ) #访问第一个元素1print (s:3 ) #检索系列中的前三个元素1,2,3print (s-3: ) #检索系列中的最后三个元素3,4,5(2)使用索引访问Pandas系列中数据系列Series就像一个固定大小的字典,可以通过索引标签获取和设置值。s = pd
6、.Series(1,2,3,4,5,index = a,b,c,d,e)print(sb) #结果是2print (sa,c,d) #获取索引a,c,d对应值 sb=20 np.exp(s)obj = Series(4, 7, -5, 3)obj0 41 72 -53 3dtype: int6411.1.2 DataFrame数据框(DataFrame)是二维数据结构,即数据以行和列的表格方式排列。基本上可以把 DataFrame 看成是共享同一个indexindex索引索引的Series的集合。构造函数创建pandas.DataFrame( data, index, columns, dty
7、pe, copy)11.1.2 DataFrame1 1从从单个列表创建列表创建DataFrameDataFrameimport pandas as pddata = 10,20,30,40,50df = pd.DataFrame(data)print (df)2 2从从多维列表创建列表创建DataFrameDataFrameimport pandas as pddata = Alex,10,Bob,12,Clarke,13df = pd.DataFrame(data,columns=Name,Age)print (df)11.1.2 DataFrame(3)从键值为ndarrays/List
8、s的字典来创建import pandas as pddata = Name:Tom, Jack, Steve, Ricky,Age:28,34,29,42df = pd.DataFrame(data)print (df)(4)从系列Series的字典来创建import pandas as pdd = one : pd.Series(1, 2, 3, index=a, b, c), two : pd.Series(1, 2, 3, 4, index=a, b, c, d)df = pd.DataFrame(d)print (df)DataFrame的基本功能DataFrame的基本功能 impo
9、rt pandas as pd df = pd.read_csv(marks2.csv) # marks2.csv是成绩信息 df.T #DataFrame的转置。实现行和列将交换DataFrame的基本功能head()和tail()要查看DataFrame对象的部分数据,可使用head()和tail()方法。head()返回前n行(默认数量为5)。tail()返回最后n行(默认数量为5)。但可以传递自定义的行数。DataFrame的行列操作(1)选择列通过列名从数据框(DataFrame)中选择一列import pandas as pdd = one : pd.Series(11, 12,
10、13, index=a, b, c), two : pd.Series(1, 2, 3, 4, index=a, b, c, d)df = pd.DataFrame(d)print (dfone) #选择one列DataFrame的行列操作(2)添加列import pandas as pdd = one : pd.Series(11, 12, 13, index=a, b, c), two : pd.Series(1, 2, 3, 4, index=a, b, c, d)df = pd.DataFrame(d)print (Adding a new column by passing as S
11、eries:)dfthree=pd.Series(10,20,30,index=a,b,c)print (Adding a new column using the existing columns in DataFrame:)dffour=dfone+dfthreeDataFrame的行列操作(3)删除列import pandas as pdd = one : pd.Series(1, 2, 3, index=a, b, c), two : pd.Series(1, 2, 3, 4, index=a, b, c, d), three : pd.Series(10,20,30, index=a
12、,b,c)df = pd.DataFrame(d)# 使用DEL删除功能del dfone #删除one列#使用POP删除功能df.pop(two) #删除two列print (df)DataFrame的行列操作(4)行选择,添加和删除可以通过将行标签传递给loc()函数来选择行。import pandas as pdd = one : pd.Series(1, 2, 3, index=a, b, c), two : pd.Series(1, 2, 3, 4, index=a, b, c, d)df = pd.DataFrame(d)print( df.locb )也可以通过将行号传递给ilo
13、c()函数来选择行。print (df.iloc2 ) #注意行号是零开始,所以实际是第3行也可以进行行切片,使用:运算符选择多行。print (df2:4 ) #选择第3行到第4行DataFrame的行列操作(5)添加行#使用append()函数将新行添加到DataFrame中。import import pandas as as pddf = pd.DataFrame(1, 2, 3, 4, columns = a a,bb)df2 = pd.DataFrame(5, 6, 7, 8, columns = a a,bb)df = df.append(df2)print print (df)
14、DataFrame的行列操作(6)删除行使用索引标签从DataFrame中删除或删除行。如果标签重复,则会删除多行。import pandas as pddf = pd.DataFrame(1, 2, 3, 4, columns = a,b)df2 = pd.DataFrame(5, 6, 7, 8, columns = a,b)df = df.append(df2)print (df)print (Drop rows with label 0)df = df.drop(0)print (df)11.2 Pandas统计功能DataFrame有很多函数用来计算描述性统计信息和其他相关操作。1
15、1描述性统计描述性统计描述性统计又叫统计分析,一般统计某个变量的平均值、标准偏差、最小值、最大值、以及1/4中位数,1/2中位数,3/4中位数。表11-4列出Pandas中主要的描述性统计信息的函数。四分位数(Quartile)也称四分位点,是指在统计学中把所有数值由小到大排列并分成四等份,处于三个分割点位置的数值。11.2 Pandas统计功能2 2汇总汇总DataFrameDataFrame列数据列数据describe()函数是用来计算有关DataFrame列的统计信息的摘要。包括数量count,平均值mean,标准偏差std,最小值min,最大值max,以及1/4中位数,1/2中位数,3
16、/4中位数。11.2.2 分组统计Pandas有多种方式来分组(GroupBy),如:obj.groupby(key)obj.groupby(key1,key2)obj.groupby(key,axis=1)例如:import pandas as pddf= pd.DataFrame( 199901, 张海, 男 ,100, 100, 25, 72, 199902, 赵大强, 男, 95, 54, 44, 88, 199903, 李梅, 女, 54, 76, 13, 91, 199904, 吉建军, 男, 89, 78, 26, 100 , columns = xuehao, name, se
17、x, physics, python, math, english)grouped =df.groupby(sex) #按性别分组print (grouped.get_group(男)11.3 Pandas合并合并/连接和排序连接和排序Pandas具有功能全面的高性能内存中连接操作,与SQL关系数据库非常相似。Pandas提供了一个merge()函数,实现DataFrame对象之间所有标准数据库连接操作。merge(left, right, how=inner, on=None, left_on=None, right_on=None,left_index=False, right_index
18、=False, sort=True)合并合并/连接连接import import pandas as as pdleft = pd.DataFrame( idid:1,2,3,4,5, NameName: AlexAlex, AmyAmy, AllenAllen, AliceAlice, AyoungAyoung, subject_idsubject_id:sub1sub1,sub2sub2,sub4sub4,sub6sub6,sub5sub5)right = pd.DataFrame( idid:1,2,3,4,5, NameName: BillyBilly, BrianBrian, Bra
19、nBran, BryceBryce, BettyBetty, subject_idsubject_id:sub2sub2,sub4sub4,sub3sub3,sub6sub6,sub5sub5)#id列用作键合并两个数据框。printprint(idid列用作键合并两个数据框列用作键合并两个数据框 )rs = pd.merge(left,right,on=idid)printprint(rs)合并合并/连接连接rs = pd.merge(left, right, on=subject_id, how=left)print (rs)合并合并/连接连接rs = pd.merge(left, rig
20、ht, on=subject_id, how=inner)print (rs)rs = pd.merge(left, right, on=subject_id, how=outer)print(rs)11.3.2 排序和排名 根据条件对Series对象或DataFrame对象的值排序(sorting)和排名(ranking)是Pandas一种重要的内置运算。 Series对象或DataFrame对象可以使用sort_index() / sort_values()函数进行排序,使用rank()函数进行排名。Series的排序Series的sort_index()排序函数,对Series的索引进行
21、排序,默认是升序import pandas as pds = pd.Series(10, 20, 33, index=a, c, b) # 定义一个Seriesprint(s.sort_index() # 对Series的索引进行排序,默认是升序print(s.sort_index(ascending=False) # ascending=False是降序排序对Series不仅可以按索引(标签)进行排序,还可以使用sort_values()函数按值按值排序。print(s.sort_values(ascending=False) # ascending=False是降序排序DataFrame的
22、排序 DataFrame的sort_index()排序函数使用sort_index()方法,可以对DataFrame进行排序。默认情况下,按照升序对行索引(标签)进行排序。import pandas as pddf= pd.DataFrame( 199901, 张海, 男 ,100, 100, 25, 72, 199902, 赵大强, 男, 95, 54, 44, 88, 199903, 李梅, 女, 54, 76, 13, 91, 199904, 吉建军, 男, 89, 78, 26, 100 , columns = xuehao, name, sex, physics, python, m
23、ath, english, index=1,4,6,2)如果希望按某列的值排序,例如english的成绩排序可使用by参数。sorted_df=df.sort_index(by=english) #按列的值排序(不提倡)sorted_df2=df. sort_values(by=english) #按列的值排序print (sorted_df2)排名(ranking)rank (method=average,ascending=True)method参数值first按值在原始数据中的出现顺序分配排名,还有min使用整个分组的最小排名,max是用整个分组的最大排名,average使用平均排名,也
24、是默认的排名方式。还可以设置ascending参数,设置降序还是升序排序。import pandas as pds = pd.Series(1 ,3 ,2 ,1 ,6 ,index=a ,c ,d ,b ,e)print(s.rank()# 默认是根据值的大小进行平均排名print(s.rank(method=first)11.4 Pandas筛选和过滤功能Pandas的逻辑筛选功能比较简单,直接在方括号里输入逻辑运算符在方括号里输入逻辑运算符即可即可。假设数据框如下:import pandas as pddf= pd.DataFrame( 199901, 张海, 男 ,100, 100, 9
25、5, 72, 199902, 赵大强, 男, 95, 54, 44, 88, 199903, 李梅, 女, 54, 76, 13, 91, 199904, 吉建军, 男, 89, 78, 26, 100 , columns = xuehao, name, sex, physics, python, math, english, index=1,4,6,2)df1=df (df.math80) & (df.english90)loc可以使用逻辑运算符设置具体的筛选条件。df2=df.locdf math80 #表示选取math列大于80的行print(df2)按筛选条件进行汇总很多时候我们还需要
26、对筛选后的结果进行汇总,例如求和,计数,或计算均值等等。也就是Excel中常用的sumifs和countifs函数。import pandas as pddf= pd.DataFrame( 199901, 张海, 男 ,100, 100, 95, 72, 199902, 赵大强, 男, 95, 54, 44, 88, 199903, 李梅, 女, 54, 76, 13, 91, 199904, 吉建军, 男, 89, 78, 26, 100 , columns = xuehao, name, sex, physics, python, math, english, index=1,4,6,2)
27、df1=df (df.english80)print(df1english.count()print(df1english.mean() #计算80的英语平均分按筛选条件进行汇总import import pandas as as pddf= pd.DataFrame( 199901, 张海张海, 男男 ,100, 100, 95, 72, 199902, 赵大强赵大强, 男男, 95, 54, 44, 88, 199903, 李梅李梅, 女女, 54, 76, 13, 91, 199904, 吉建军吉建军, 男男, 89, 78, 26, 100 , columns = xuehaoxueh
28、ao, namename, sexsex, physicsphysics, pythonpython, mathmath, englishenglish, index=1,4,6,2)s2=df.locdf mathmath80.math.sum() #表示选取math列小于80的行求math总和printprint(s2)s2=df.locdf mathmath80.math.mean() #表示选取math列小于80的行求math平均分printprint(s2)过滤过滤根据定义的条件过滤数据,并返回满足条件的数据集。filter()函数用于过滤数据。filter()函数格式如下:Seri
29、es.filter(items=None, like=None, regex=None, axis=None)DataFrame.filter(items=None, like=None, regex=None, axis=None)例如:df1=df.filter(items=sex, math, english) #筛选需要的列筛选需要的列print(df1)也可以使用regex正则表达式参数。例如获取列名列名h h结尾的数据结尾的数据。df2=df.filter(regex=h$, axis=1)like参数意味“包含”。例如获取行索引包含2的数据。df3=df.filter(like=
30、2, axis=0)11.5 Pandas数据导入导出1.导入CSV文件import pandas as pddf = pd.read_csv(marks.csv)还有另外一种方法:df = pd.read_table(marks.csv, sep=,)11.5.2 读取其它格式数据1. 导入Excel文件pd.read_excel(filename)从Excel文件导入数据。例如:xls = pd.read_excel(marks.xlsx)sheet1 = xls.parse(Sheet1)sheet1 就是一个 DataFrame 对象。11.5.2 读取其它格式数据2. 导入JSON格
31、式文件Pandas提供的read_json()函数,可以用来创建Series或者pandas DataFrame数据结构。(1)利用JSON字符串import pandas as pdjson_str = country:china,city:zhengzhou df = pd.read_json(json_str,typ=series)s=df.to_json() #to_json()方法将其从pandas Series转换成JSON字符串上面的例子中,我们是利用JSON字符串来创建pandas Series的。(2)利用JSON文件调用read_json()函数时既可以向其传递JSON字符
32、串,也可以指定一个JSON文件。data = pd.read_json(aa.json,typ=series) #导入JSON格式文件11.5 Pandas数据导出11.5.3 11.5.3 导出导出excelexcel文件文件data.to_ excel (filepath, header = True, index = True)filepath为文件路径,参数index=False表示导出时去掉行名称,默认为True。Header表示是否导出列名,默认为True。import pandas as pddf = pd.DataFrame(1,2,3,2,3,4,3,4,5)#给datafr
33、ame增加行列名df.columns = col1,col2,col3df.index = line1,line2,line3 df.to_excel(aa.xlsx, index = True)ImportError: No module named openpyxl用pip 安装 openpyxl 模块: pip install openpyxl11.5 Pandas数据导出11.5.4 11.5.4 导出导出CSVCSV文件文件data.to_ csv (filepath,sep=, ,header = True, index = True)filepath为生成的CSV文件路径,参数index=False表示导出时去掉行名称,默认为True。Header表示是否导出列名,默认为True。Sep参数是csv分割符,默认为逗号。import pandas as pddf = pd.DataFrame(1,2,3,2,3,4,3,4,5 ,columns = col1,col2,col3 ,index = line1,line2,line3 ) df.to_csv(aa.csv, index = True)
限制150内