1、11.1.1 安装和导入NumPy库NumPy是Python语言的扩展库,因此需要额外安装NumPy库。1.安装NumPy模块输入下面的安装命令:pip install numpy2.导入NumPy模块使用下面的语句导入NumPy库:import numpy as np#业界提倡的模块导入语法11.1.2 创建ndarray数组1.数组对象的创建array()方法的语法格式如下:np.array(object,dtype=数据类型,order=C|F|A)【例11-1】利用array()方法创建一维数组和二维数组。import numpy as npa=1,2,3,4#创建列表对象na=np.
2、array(a)#创建一维数组b=11,22,33,55,66,77#创建二维嵌套列表nb=np.array(b)#创建二维数组print(na:,na)print(nb:,nb)在IDLE中的运行结果如图11-1所示。【例11-2】利用array()方法创建一维数组,数组元素是复数类型。import numpy as nparray=np.array(1,2,3,dtype=complex)#dtype为复数print(array)在IDLE中的运行结果如下:1.+0.j 2.+0.j 3.+0.j2.显示数组维度的shape属性使用shape属性查看数组维度(也称形状)的大小,其语法格式如
3、下:arr.shape例如,元组(3,)表示一个一维数组,只含有3个元素。例如,元组(3,4)表示一个二维数组,其中第一个维度中有3个元素,第二个维度中有4个元素。【例11-3】用shape属性显示一维数组。import numpy as npa=np.array(1,2,3)print(a.shape)#输出(3,)【例11-4】用shape属性显示二维数组。import numpy as npb=np.array(1,2,3,3,4,5)print(b.shape)#输出(2,3)3.数组元素的总个数属性size数组元素的总个数属性的语法格式如下:arr.size【例11-5】使用size
4、属性显示数组元素的总个数。import numpy as npa=np.eye(3,3,0)#3x3对角为1的float矩阵,dtype默认为floatprint(a:,a)print(a.size:,a.size)#显示a.size:9print(a.shape:,a.shape)#显示a.shape:(3,3)11.1.3 ndarray数组的数据类型1.ndarray的数据类型ndarray的数据类型,见表11-1。2.数据类型的查看可以使用dtype属性查看数组的类型。其语法格式为:arr.dtype3.转换数据类型可以使用astype()方法将一个数组的数据类型转换为另一个数据类型。
5、其语法格式如下:arr.astype(np.类型)或arr.astype(类型)【例11-6】创建数组对象,查看数组对象的类型,然后从int32数据类型转换为float64数据类型。import numpy as npa=np.array(1,2,3)print(a.dtype)#显示int32newa=a.astype(np.float64)#newa=a.astype(float64)print(newa.dtype)#显示float6411.1.4 ndarray数组的索引与切片1.一维数组的索引和切片(1)索引数组通过方括号运算符和索引对数组中的元素进行访问。索引的语法格式如下:数组名
6、index(2)切片1)用冒号切片。用冒号切片是指通过方括号中的元素位置索引,用冒号分隔索引的区间范围来进行切片操作。其语法格式如下:数组名start:stop:step【例11-7】一维数组的索引与使用冒号切片示例。import numpy as npa=np.arange(10)print(a=,a)#a=0 1 2 3 4 5 6 7 8 9print(a3=,a3)#a3=3print(a5:8=,a5:8)#a5:8=5 6 7print(a0:10:2=,a0:10:2)#a0:10:2=0 2 4 6 8print(a:5=,a:5)#a:5=0 1 2 3 4print(a:-
7、1=,a:-1)#a:-1=0 1 2 3 4 5 6 7 8print(a6:1:-2=,a6:1:-2)#a6:1:-2=6 4 2print(a:-1=,a:-1)#a:-1=9 8 7 6 5 4 3 2 1 0b=a1:5b1=100print(a=,a)#a=0 1 100 3 4 5 6 7 8 9print(b=,b)#b=1 100 3 42)整数列表切片。整数列表切片法的语法格式如下。数组名n1,n2,.,nx【例11-8】一维数组整数列表切片法示例。import numpy as np a=np.array(aa,bb,cc,dd,ee,ff)b=a0,2,3,5 aar
8、ray(aa,bb,cc,dd,ee,ff,dtype=barray(aa,cc,dd,ff,dtype=b2=22 a2=33 aarray(aa,bb,33,dd,ee,ff,dtype=barray(aa,cc,22,ff,dtype=U2)2.二维数组的索引和切片(1)索引二维数组对于二维数组,通过索引可以得到低一级维度的元素,即每个索引位置上对应的元素是一维数组。只须将数组中的每一行每一列分别看作一个列表,参照一维数组的索引、切片的方法。【例11-9】二维数组索引与切片示例。import numpy as npa=np.array(1,2,3,4,5,6,7,8,9)print(a=
9、,a)print(a1=,a1)#索引a1,得到一维数组print(a1:=,a1:)#从数组索引a1:处开始切片,得到二维数组运行结果如图11-2所示。(2)访问二维数组的单个元素对于二维数组,如果要访问数组中的单个元素,可以通过以下两种方法。数组名x,y或数组名xy索引序号都是从0开始。行索引x是数组中的第x+1行的列表,列索引y是该行列表中的第y+1个元素。【例11-10】访问二维数组的单个元素。import numpy as npa=np.array(1,2,3,4,5,6,7,8,9)print(a02=,a02)#显示3print(a12=,a12)#显示63.多维数组的索引和切片
10、(1)索引多维数组对于多维数组的索引,返回的对象是降低一级维度之后的ndarray。【例11-11】针对一个223的三维数组,返回一个23的二维数组。import numpy as npa=np.array(1,2,3,4,5,6,7,8,9,10,11,12)#创建三维数组print(a=,a)print(a0=,a0)#索引返回二维数组print(a1=,a1)#索引返回二维数组print(a:=,a:)#切片返回原数组的一部分print(a0:1=,a0:1)#切片运行结果如图11-3所示。(2)访问多维数组的单个元素在多维数组中,中括号内的索引用逗号分隔。以三维数组为例,可以通过以下两
11、种方法获取数组中的单个元素:数组名x,y,z或数组名xyz例如,获取三维数组a的第1个元素,则写为a0,0,0或a000。【例11-12】三维数组的索引和切片操作示例。创建一个234的三维数组,用来表示一个2层楼,每层楼的房间排列为3行4列,通过索引切片操作获得指定房间。import numpy as npa=np.arange(24).reshape(2,3,4)#创建三维数组print(a=,a)print(a0,0,0=,a0,0,0)#选取第1层楼,第1行第1列的房间,显示0print(a:,0,0=,a:,0,0)#选取所有楼层的第1行第1列的房间,显示 0 12print(a0,:
12、,:=,a0,:,:)#选取第1层楼的所有房间print(a0,.=,a0,.)#选取第1层楼的所有房间,其中多个连续的“:”可以用一个“.”代替print(a0,1,=,a0,1,)#选取第1层楼的第1行的所有房间print(a0,1,:2=,a0,1,:2)#选取第1层楼的第1行的部分房间,从第1个开始到最后(不包括最后一个),间隔2个print(a.,1=,a.,1)#选取所有楼层中位于第2列的房间print(a:,1=,a:,1)#选取所有楼层中位于第2行的房间print(a0,:,1=,a0,:,1)#选取第1层楼中位于第2列的房间print(a0,:,-1=,a0,:,-1)#选取
13、第1层楼中所有位于最后一列的房间print(a0,:-1,-1=,a0,:-1,-1)#反向选取第1层楼中所有位于最后一列的房间print(a:-1=,a:-1)#把第1层楼和第2层楼的房间交换运行结果如图11-4所示。11.1.5 ndarray数组的运算1.算术运算NumPy还为数组的算术运算定义了各种ufunc函数,见表11-2。例如,如果两个数组a和b的维度相同,即满足a.shape=b.shape,那么ab的结果就是a与b数组对应位相乘。这要求维数相同,且各维度的长度相同。【例11-13】两个数组相乘示例。import numpy as npa=np.array(1,2,3,4)b=
14、np.array(10,20,30,40)c=a*b#c=np.multiply(a,b)#或者用下面两行语句#c=np.zeros(4,),dtype=np.int32)#创建shape为4的整型数组#np.multiply(a,b,c)#c数组必须已经创建print(c)运行结果为:10 40 90 1602.比较运算NumPy还为数组的比较运算定义了各种ufunc函数,见表11-3。【例11-14】比较两个数组。import numpy as npa=np.array(1,2,3,4)b=np.array(0,5,-2,8)c=a 1,a 500)#输出大于500的值print(s*2+
15、10)#算术运算print(np.sqrt(s)#计算各个元素的平方根#两个对象相加ser01=pd.Series(1,2,3,4,index=101,102,104,105)ser02=pd.Series(4,5,6,7,8,index=101,102,103,105,106)print(ser01+ser02)运行结果如图11-10所示。11.2.3 Pandas的DataFrame对象1.创建DataFrame对象创建DataFrame对象的语法格式如下:pd.DataFrame(data,index=行索引,columns=列索引)(1)从列表创建DataFrame对象【例11-24】
16、从列表创建DataFrame对象示例。import pandas as pddata=101,张三,girl,18,102,李四,boy,20,103,王五,girl,19#创建二维列表#从列表创建DataFrame对象,省略行索引和列索引df=pd.DataFrame(data)#与上一行的功能相同#df=pd.DataFrame(data,index=range(0,3),columns=range(0,4)print(df)data=101,张三,girl,18,102,李四,boy,20,103,王五,girl,19#创建一维列表df=pd.DataFrame(data)#从列表创建D
17、ataFrame对象print(df)运行结果如图11-11所示。(2)从字典创建DataFrame对象【例11-25】从字典创建DataFrame对象示例。import pandas as pddata=序号:101,102,103,姓名:张三,李四,王五,性别:girl,boy,girl,年龄:18,20,19#创建字典df=pd.DataFrame(data)#指定行索引print(df)运行结果如图11-12所示。【例11-26】从字典创建DataFrame对象,并且指定行、列索引。把例11-25的df语句改为:df=pd.DataFrame(data,index=第1行,第2行,第3
18、行,columns=序号,姓名,年龄,身高,性别)print(df)因字典中没有“身高”,运行结果如图11-13所示。【例11-27】用嵌套字典创建DataFrame对象。import pandas as pddata=工资:2017:30,2018:50,2019:45,2020:35,奖金:2018:15,2019:25,2020:10,支出:2017:-30,2018:-20,2019:-45,2020:-35df=pd.DataFrame(data,index=2020,2019,2018,2017)#指定行索引print(df)运行结果如图11-14所示。2.获取DataFrame的
19、常用属性(1)获取值语法格式如下:df.values#返回二维数组形式,元素之间用空格分隔df.values行下标#返回一维数组形式,元素之间用空格分隔df.values行下标,列下标#返回元素,一般是标量df.mean(0)#参数0表示求列平均值df.mean(1)#参数1表示求行平均值(2)获取行索引语法格式如下:df.index#返回Series对象df.index.values#返回数组,元素之间用空格分隔df.index.values.tolist()#返回列表,元素之间用逗号分隔df.index行下标#返回元素,一般是标量(3)获取列索引语法格式如下:df.columns#返回Se
20、ries对象df.columns.values#返回数组,元素之间用空格分隔df.columns.values.tolist()#返回列表,元素之间用逗号分隔df.columns列下标#返回元素,一般是标量(4)获取元素总数通过该对象的size属性获取该对象的元素总数。语法格式如下:df.size(5)获取维度信息获取维度信息使用该对象的shape属性,语法格式如下:df.shape(6)获取行数获取行数的语法格式如下:df.shape0或len(df.index)(7)获取列数获取列数的语法格式如下:df.shape1或len(df.columns)或df.columns.size【例11-
21、28】获取DataFrame对象中的常用属性。import pandas as pddf=pd.DataFrame(101,张三,girl,18,102,李四,boy,20,103,王五,girl,19,index=1,2,3,columns=序号,姓名,性别,年龄)print(df.values=)print(df.values)#所有值,返回二维数组print(df.values1=,df.values1)#返回下标是1的值,返回一维数组print(df.values1,2=,df.values1,2)#返回下标是1,2的元素,是标量print(-*50)print(df.index=,d
22、f.index)#行索引,返回Series对象print(df.index.values=,df.index.values)#返回数组,元素之间用空格分隔print(df.index.values.tolist()=,df.index.values.tolist()#返回列表,元素之间用逗号分隔print(df.index1=,df.index1)#行索引,返回行下标是1(第2行)的元素print(-*50)print(df.columns=,df.columns)#列索引,返回Series对象colname=df.columns.values#返回数组,元素之间用空格分隔print(df.c
23、olumns.values=,colname)colname=df.columns.values.tolist()#返回列表,元素之间用逗号分隔print(df.columns.values.tolist()=,colname)print(df.columns2=,df.columns2)#列索引,返回列下标是2(第3列)的元素print(df.size=,df.size)#元素总个数print(df.shape=,df.shape)#形状信息print(df.shape0=,df.shape0,len(df.index)#行数print(df.shape1=,df.shape1,len(df
24、.columns)#列数运行结果如图11-15所示。3.DataFrame的head()、tail()和describe()方法DataFrame对象的head()方法返回开头前n行,tail()方法返回最后n行。如果没有设定n,则默认值为5行。其语法格式如下:df.head(n)df.tail(n)DataFrame对象的describe()方法显示每栏的统计数据。该方法只对数值型栏作统计,统计量包括个数、均值、标准差、最小值、25-50-75百分数值、最大值。一般用于在数据分析前先查看数据是否有缺失,数据是否有异常等。其语法格式如下:df.describe()查看各个字段的信息,其语法格式
25、为:df.info()【例11-29】DataFrame对象中的常用方法示例。import pandas as pddf=pd.DataFrame(101,张三,girl,18,102,李四,boy,20,103,王五,girl,19,index=1,2,3,columns=序号,姓名,性别,年龄)print(df.head(2)=)print(df.head(2)#开头前2行print(df.tail()=)print(df.tail()#最后5行print(df.describe()#统计运行结果如图11-16所示。4.获取指定的行、列(1)获取指定的行获取DataFrame对象的某行,不
26、能直接索引。需要使用loc或iloc存取器,通过行索引获取指定的行,结果的返回为Series对象,并且包含列名。其语法格式如下:df.loc行索引名df.iloc行下标loc与iloc的功能相同,iloc只能使用整数下标。【例11-30】针对摆地摊一天的销售情况,按要求获取指定的行。import pandas as pddata=11,老冰棍,2,12,绿舌头,4,13,棒棒冰,1,15,冰工厂,3,17,脸雪糕,2idx=2020-06-01,2020-06-02,2020-06-03,2020-06-04,2020-06-05#行名col=编号,名称,销售数量#列名df=pd.DataFr
27、ame(data,index=idx,columns=col)#创建Dataframeprint(df)print(-*50)print(df.loc2020-06-02=)indexname=df.loc2020-06-02#返回Series对象print(indexname)print(-*50)print(df.iloc2=)indexname=df.iloc2#返回Series对象print(indexname)print(type(indexname)#显示返回的数据类型运行结果如图11-17所示。(2)获取指定的列语法格式为:df列索引名例如,例11-30中的df名称,得到的是“名
28、称”列的一列数据,返回的是一个Series对象,包括行索引。DataFrame中可以使用布尔型数组选取行,例如选取“销售数量”列中值大于2的行,代码为:print(dfdf销售数量2)DataFrame不支持通过列的下标来索引,但是可以借助列索引属性实现用下标的间接索引。例如,获得第1列:#col0=df0#这样直接使用下标将报错#先通过列下标获得列索引名df.columns列下标,再用列索引名实现索引col0=dfdf.columns0【例11-31】获取指定的列。在例11-30的基础上增加下面的代码:print(销售数量2的行:)print(dfdf销售数量2)print(df名称=)co
29、lname=df名称#返回Series对象print(colname)print(-*50)print(df%s=%df.columns2)print(dfdf.columns2)运行结果如图11-15所示。5.DataFrame的切片(1)行切片例如,例11-31中,通过iloc0:3切片,左闭右开,即切取第1行、第2行和第3行。df_row=df.iloc0:3例如,例11-31中,用下标组成列表0,2,3传入iloc中,即切取第1行,第3行和第4行。df_row=df.iloc0,2,3例如,例11-31中,通过行的下标位置df1:3切片,左闭右开,即切取第2行和第3行。df_row=d
30、f1:3(2)列切片例如:df_col=dfdf.columns0:3#切取第1列、第2列和第3列df_col=df编号,销售数量#切取列表中列出的列,即编号、销售数量这两列(3)局部切片例如:df_item=df.loc2020-06-01,2020-06-03,2020-06-04,名称,销售数量例如,下面的代码,切取第1行和第2行,“编号”“销售数量”列。df_item=df0:2编号,销售数量【例11-32】切片的完整示例。import pandas as pddata=11,老冰棍,2,12,绿舌头,4,13,棒棒冰,1,15,冰工厂,3,17,脸雪糕,2idx=2020-06-01
31、,2020-06-02,2020-06-03,2020-06-04,2020-06-05#行名col=编号,名称,销售数量#列名df=pd.DataFrame(data,index=idx,columns=col)#创建Dataframeprint(df.iloc0:3=)df_row=df.iloc0:3print(df_row)print(-*50)print(df.iloc0,2,3=)df_row=df.iloc0,2,3print(df_row)print(df1:3=)df_row=df1:3print(df_row)print(+*50)df_col=dfdf.columns0:
32、3print(df_col)print(-*50)df_col=df编号,销售数量print(df_col)print(+*50)df_item=df.loc2020-06-01,2020-06-03,2020-06-04,名称,销售数量print(df_item)print(-*50)df_item=df0:2编号,销售数量print(df_item)print(type(df_item)#显示获得切片的数据类型运行结果如图11-16所示。6.获取某位置上的元素(1)通过行索引、列索引定位例如,获取例11-32中的“棒棒冰”元素,因该元素的行索引是“2020-06-03”,列索引是“名称”,
33、代码为:item=df.loc2020-06-03名称(2)通过at存取器方法例如,还是获取例11-32中的“棒棒冰”元素,代码为:item=df.at2020-06-03,名称(3)通过iat存取器例如,仍然获取例11-32中的“棒棒冰”元素,该元素的下标是2,1,代码为:item=df.iat2,1用iat存取器可以修改该元素的值,例如:df.iat2,1=小布丁7.修改列名和行名修改列名,其形式如下:df.columns=col1,col2,col3修改行名,其形式如下:df.index=row1,row2,row3,row4,row58.增加行、列(1)增加行其语法格式如下:df.ap
34、pend(被添加的DataFrame对象)【例11-33】在例11-32的df对象中添加两行新行。添加下面的代码:data_new=20,冰淇淋,5,14,酸奶块,4#两行的列表idx_new=2020-06-05,2020-06-11#行索引df_new=pd.DataFrame(data_new,index=idx_new,columns=col)#创建一个新的二维DataFrame对象,列索引col用已有的df=df.append(df_new)#追加到原有Dataframe对象的尾部print(df)#显示df运行结果如图11-17所示。(2)增加列创建新的Series对象并添加到原有
35、Dataframe对象中列的尾部,即可实现列的增加。【例11-34】在例11-33的df对象中添加1列新列。添加下面的代码:data=2.5,3.5idx=2020-06-02,2020-06-05df单价=pd.Series(data,index=idx)#创建新Series对象,作为新追加的列print(df)运行结果如图11-18所示。9.删除行、列(1)删除行通过向df.drop()中传入行索引值实现对行的删除,其语法格式为:df.drop(行索引)【例11-35】在例11-34中删除行索引值是“2020-06-05”的行。添加下面代码:df=df.drop(2020-06-05)pr
36、int(df)运行结果如图11-19所示。(2)删除列其语法格式如下:del df列索引值df.pop(列索引值)【例11-36】在例11-35中删除“单价”列,代码如下:del df单价#df.pop(单价)print(df)10.数据补全其语法格式为:df=df.fillna(补全的数据)df.fillna(补全的数据,inplace=True)上面两行代码的功能相同。例如对未知性别补全为“男”,df.fillna(男,inplace=True)。【例11-37】从字典创建DataFrame对象,因为有些数据项没有提供而造成空项,显示NaN。下面将这些NaN项补0.0。import pan
37、das as pddata=编号:11,名称:老冰棍,单价:2,销售数量:2,编号:12,名称:绿舌头,单价:3,销售数量:4,编号:13,名称:棒棒冰,单价:4,编号:15,名称:冰工厂,单价:5,编号:17,名称:脸雪糕,单价:6,销售数量:2#字典idx=2020-06-01,2020-06-02,2020-06-03,2020-06-04,2020-06-05#行索引名col=编号,名称,单价,销售数量#列索引名df=pd.DataFrame(data,index=idx,columns=col)#创建Dataframeprint(df)#显示Dataframe对象df=df.fill
38、na(0)#df.fillna(0,inplace=True)#就地补0,代码等价print(df)#显示补0后的Dataframe对象运行结果如图11-20所示。11.DataFrame的算术运算两个DataFrame对象可以进行相加、相减、相乘、相除运算,会对两个矩阵行索引(包括行索引名称和行索引值)和列索引相同的两个对应元素做运算。请参考Series的算术运算。11.2.4 Pandas的文件操作1.读取文件Pandas中常用的读取数据文件的方法见表11-6。下面介绍读取Excel文件的过程。Pandas处理Excel文件需要xlrd、openpyxl模块,所以需要提前安装这3个模块,安
39、装命令是:pip install pandaspip install xlrdpip install openpyxl用read_excel()方法读取xls和xlsx文件,读取Excel文件的语法格式如下:pd对象.read_excel(io,sheet_name=0,header=0,index_col=None,names=None)读取文件的过程大致分成两步:第一步是读取Excel文件,使用pd.read_excel()方法读取到的数据是一个DataFrame表格型数据,每一列都是一个Series对象。第二步是把读取到的数据进行切片分组等操作,获得需要处理的数据。【例11-38】读取E
40、xcel文件d:/data/score.xlsx,并显示读到的数据。score.xlsx中的数据如图11-24所示。import pandas as pddf=pd.read_excel(d:/data/score.xlsx,sheet_name=Sheet1)data=df.head(10)#获取前面10行,如果不为空的数据不到10行,自动获取所有全部非空数据print(data)print(df.head(10):)print(data)#显示读到的数据print(df姓名3:,df姓名4)#按列索引行下标取值print(df.iat4,1:,df.iat4,1)#按下标定位iat行下标,
41、列下标df.iat4,3=100#更改元素的值df学号=df学号.astype(str)#学号列的数据类型改为strdf总分=df总分.astype(int)#总分列的数据类型改为intdf.to_excel(d:/data/dfscore.xlsx,sheet_name=Sheet1)#把df写入到d:datadfscore.xlsxdata.to_excel(d:/data/datascore.xlsx,sheet_name=Sheet1)#把df写入到d:datadfscore.xlsx运行结果如图11-25所示。2.写入文件处理完成的DataFrame对象可以写入文件,Pandas提供
42、了数据写入文件和数据库的方法。Pandas中常用的写入文件的方法见表11-7。下面介绍写入Excel文件的过程。to_excel()方法的语法格式如下。df对象.to_excel(excel_writer,sheet_name=None,na_rep=,header=0,index=True)【例11-37】把例11-38中的DataFrame数据写入Excel文件。本实例中,要把df对象写入到Excel文件,将下面的语句添加到代码最后:df.to_excel(d:/data/dfscore.xlsx,sheet_name=Sheet1)#把df写入到d:/data/dfscore.xlsx如
43、果要把创建的data对象写入到d:/data/datescore.xlsx,则写入语句为:data.to_excel(d:/data/datascore.xlsx,sheet_name=Sheet1,index=False)#把data写入到文件运行程序后,用Excel打开d:/data/dfscore.xlsx和datascore.xlsx查看,如图11-26所示。11.2.5 计算统计Pandas提供了对Series和DataFrame进行统计的方法,见表11-8。【例11-40】Pandas对象的数值计算。import pandas as pddf=pd.read_excel(d:/data/score.xlsx,sheet_name=Sheet1)#遍历二维数组,把“缺考”的元素值改为0for i in range(len(df.index):for j in range(len(df.columns):if(df.iati,j=缺考):df.iati,j=0#把“缺考”的元素值改为0print(每列的最大值:)print(df.max()#计算每列的最大值print(计算均值:)print(df.mean()#计算每列的均值运行结果如图11-27所示。