1、数据库与大数据技术本栏目责任编辑:王力Computer Knowledge and Technology电脑知识与技术第19卷第1期(2023年1月)第19卷第1期(2023年1月)两个Python第三方库:Pandas和NumPy的比较华振宇(南昌大学 抚州医学院,江西 抚州 344000)摘要:Pandas和NumPy作为Python数据分析框架下的两个第三方库,已成为数据科学领域相关工作的常见工具和技术。文章在简要介绍Pandas和NumPy特点的基础之上,从开源社区支持、基础数据结构、内存占用、数据兼容性、性能表现、数据对象、数据类型、访问方法、索引功能、可操作性、文件存储、使用场景、
2、机器学习和人工智能中的应用等方面,细致比较了二者之间的异同,以期帮助研究者更加合理地选择和使用这两个第三方库。关键词:Pandas;NumPy;Python中图分类号:TP311文献标识码:A文章编号:1009-3044(2023)01-0071-03开放科学(资源服务)标识码(OSID):1 引言我国 “十四五”数字经济规划 中明确提出要“充分发挥数据要素作用”,数据科学相关的研究工作在我国当前的发展形势可谓如火如荼。Python作为近年持续流行的主流编程语言之一,由于其语法简洁、功能强大,且具有能够提供完整数据分析框架的成熟开发生态,早已成为人工智能、大数据、机器学习等领域研究工作的常见工
3、具和选择1-2。本文在扼要介绍Python生态中的两个科学计算库:NumPy和Pandas的基础之上,简明概括二者之间的异同,以期能够帮助读者迅速理解和掌握这两个工具的使用,并以此为基础开展自己的数据研究工作。2 NumPy及其简介NumPy(Numerical Python)是一个开源的Python科学计算库,是Python生态中最重要的底层支持库之一,支持快速的数组和矩阵运算3。NumPy 1.0发布于2006年,目前的最新版本是1.23。NumPy具有如下特点:1)使用数组作为其内部数据结构,而非Python列表中所使用的对象指针,因此其访问性能远远超出原生的Python列表结构;2)代
4、码采用 C/C+实现,具有极为优异的运行效率;3)通常用于组织同构(质)的数据对象;4)可以表达一维或多维数组;5)支持线性代数、数理统计、多项式、傅里叶变换等多种数学计算;6)支持数组的组合、分割、形状改变、排序等操作;7)当参与运算的两个数组形状不一致时,将按照广播规则进行运算,规则如下:参加运算的数组都向维数最大的数组看齐,维数较小的数组在前面加1补齐;结果数组的形状取各运算数组各轴的最大值;若运算数组某轴长度为1,则该轴可扩充为结果数组的对应轴的长度,否则不能扩充;检查扩充后所有运算数组的各轴长度,全部相同则符合规则可以计算,否则违反规则无法计算。8)已被其他第三方库:如Pandas、
5、Seaborn、TensorFlow等包含使用4。关键代码示例:假定已通过import numpy as np进行导入。1)创建一个包含4行3列的二维数组arr=np.array(0,1,2,3,4,5,6,7,8,9,10,11)输出数组如图1所示:图1 arr数组输出2)使用基本索引获取其中某个数据NumPy中的索引操作和Python中的原生列表类型相似。索引总是从0开始编号,并且书写于一对中括号内部。假设想从如上矩阵中访问第三行第二列的元素(7),应使用如下表达式:arr21收稿日期:2022-08-15作者简介:华振宇(1983),男,江西抚州人,工程师,硕士,研究方向为大数据分析。E
6、-mail:http:/Tel:+86-551-65690963 65690964ISSN 1009-3044Computer Knowledge and Technology电脑知识与技术Vol.19,No.1,January202371DOI:10.14004/ki.ckt.2023.0041本栏目责任编辑:王力数据库与大数据技术Computer Knowledge and Technology电脑知识与技术第19卷第1期(2023年1月)第19卷第1期(2023年1月)3)使用切片获取数据子集如果需要一次性地获取多个数据,则应使用切片操作。在NumPy中,需要分别指定行的范围和列的范围。
7、依然以上文矩阵为例,如果需要访问第一行和第二行,第二列和第三列共同构成的数据子集,可使用如下表达式:arr0:2,1:3当使用a:b这样的形式表达一个特定范围时,具体的取值范围应该是a,a+1,.,b-1(数值b应该被排除在外)。最终的输出结果如图2所示:图2 使用切片获取的二维数组子集4)矩阵的转置操作正如前文提及,NumPy 内置大量的矩阵运算函数。方法transpose()直接返回给定矩阵的转置矩阵。输出结果如图3所示:图3 调用transpose()后的转置矩阵3 Pandas及其简介Pandas是目前Python生态中最常用的数据分析工具库之一。该库以NumPy为基础,增加了标签支持
8、,整合了对数据集的读取、清洗、转换、分析、统计、绘图等一系列工作流程,能够高效地处理和分析各类数据5。Pandas提供了两种最基本的数据结构:序列(Series)和数据框(DataFrame),分别用于带标签的一维数组和二维数组的表示。Pandas具有如下特点:1)能够处理残缺数据;2)支持可视化,能够生成常见的图表,如饼图、直方图、关联图等;3)强大的分组和排序功能;4)支持对各种主流文件格式的导入导出,如csv,hdf5,xlsx;5)支持数据的合并、清洗和索引重建;6)内置loc和iloc取数器获取数据子集,其中loc允许用户通过标签获取子集,而iloc则借助整数索引下标;7)通过gro
9、upby()方法支持分组统计;8)通过apply()方法,可由匿名lambda函数对各行或各列进行数据变换;9)提供内置函数可对空值、缺失数据项进行清洗。关键代码示例:假定已通过 import pandas as np 及 from pandasimport Series,DataFrame进行导入。创建数据框对象以前述创建的二维数组arr为基础,构造一个携带行标签和列标签的四行三列的数据框对象。代码如下:df=DataFrame(arr,index=list(abcd),columns=list(xyz)输出数据框如图4所示:图4 DataFrame输出示意图通过标签访问数据框中的某个数据依
10、然以访问第三行第二列的数值7为例,其表达式应为:df.loccy 或 df.locc,y使用基于标签的切片获取子数据框与NumPy相似,Pandas中同样支持切片而且提供基于标签的切片。当使用整数索引切片时,冒号后的数字不被包括在内;如果使用标签切片,冒号前后的标签都应包括在内。在以上数据框中,如欲获取包含第一、二行,第二、三列构成的子数据框,则可使用如下表达式:df.loca:b,y:z当然,Pandas提供iloc作为基于整数索引的切片访问方式,代码为:df.iloc0:2,1:3(与NumPy中的切片相似)获取的子数据框输出如图5所示:图5 通过标签切片获得的子数据框排序Pandas中排
11、序可以作用于索引或数据值。对行或列索引排序时使用sort_index()方法,按数据值排序时使用sort_values()方法。排序后返回一个有序的新对象,而不直接改变原数据框的排列顺序。使用sort_index()方法时,有两个常见的可选参数:ascending和axis。ascending默认取值为True表示按升序排序,若设为False则按降序排列。axis默认取值为0表示对行索引进行排序,若设为1则对列索引进行排序。假如对数据框df的列索引进行降序排序,则按如下方式调用函数:df.sort_index(ascending=False,axis=1)运行以上代码输出如图6所示:72数据库
12、与大数据技术本栏目责任编辑:王力Computer Knowledge and Technology电脑知识与技术第19卷第1期(2023年1月)第19卷第1期(2023年1月)图6 对列索引降序排序sort_values()同样支持ascending和axis参数。axis默认取值为0表示对列进行排序,若设为1则对行进行排序。此外,由于数据框存在多行或者多列,必须通过by参数指定参与排序的行或列。假如对数据框df按x列数据降序排列,则应按如下方式进行函数调用:df.sort_values(ascending=False,by=x)运行以上代码输出如图7所示:图7 按照x列数据降序排序4 Pan
13、das和NumPy的比较Pandas基于NumPy实现,同时广泛应用于数据科学相关领域工作,二者之间可谓既有区别又有联系。以下将从开源社区支持、基础数据结构、内存占用、数据兼容性、性能表现等13个方面,逐一对Pandas 和NumPy进行细致的比较:1)开源社区支持Pandas和NumPy均为开源代码库,因此其开源社区的研发水平、活跃程度对于代码库的后续发展和维护,都起着至关重要的作用。表1总结了截止笔者撰写本文时这两个代码库在GitHub上的相关统计数据:表1 Pandas和NumPy在GitHub上的统计数据对比最新版本累计发布次数贡献者人数累计提交次数使用数量收 藏分 枝关 注Panda
14、sv1.5.291274530726794k36k15.4k1.1kNumPyv1.23.5921401308701.2m21k7.5k567由此不难发现:目前这两个代码库在开源社区都享有较高的关注度和活跃度,预期在将来依然可以得到良好的发展与维护。2)基础数据结构Pandas提供的基础数据结构是序列(Series)和数据框(DataFrame)。序列是带有标签的一维数组;而数据框则可视为由多个具有相同标签的序列构成的二维数组。数据框可同时附带行标签和列标签。NumPy则以N维数组(ndarray)作为基础数据结构。3)内存占用NumPy 的内存占用要小于 Pandas。原因在于:Pandas
15、依然使用对象指针表示序列和数据框中的数据。此外,Pandas还需要额外存储数据的标签(索引)。4)数据兼容性Pandas基于NumPy实现,适用于任何扁平(表格)结构数据的处理。而NumPy更常见于纯粹的数值或矩阵运算。5)性能表现二者均提供了基于IRIS数据集的性能测试报告。测试结果表明,当数据记录条数在5万以下时,NumPy具有更好的运算性能。如果超出50万条记录,Pandas的表现更胜一筹。如果数据规模介于5万和50万条记录之间,关于二者之间孰优孰劣尚无明显定论。由此可见:当数据集的规模较小时,NumPy能够提供更好的性能表现;反之,理应优先考虑Pandas。6)数据对象Pandas不仅
16、提供序列和数据框作为表达一维和二维数据结构的基础数据类型,甚至还设计了表达三维数据结构的Panel数据类型;然后在Pandas的相关实践中鲜少遇见对Panel类型的使用。而NumPy则可支持N维数组。7)数据类型NumPy中的数组和Pandas中的序列/数据框类型均可作为字符串、整数、浮点数、列表等的容器类型。不同之处在于:Pandas中,数据框的数据元素类型可以是异质的换言之,每一列均可定义自己的特有类型。而NumPy中的数组类型,其全部数据元素拥有相同的数据类型换言之,所有数据必须同质。8)访问方法无论是在NumPy还是Pandas中,都能通过整数索引访问某个特定的数据、切片或者数据子集。由于Pandas集成了标签特性,还可以通过指定行标签或者列标签的方式来访问数据由于标签本身能够体现数据语义,这一方式对于编程者来说无疑更为友好。9)索引功能NumPy本质上使用数组实现,因此自带数组的快速索引这一天然优势;而Pandas基于NumPy实现,且必须在此基础上新增支持行标签和列标签的索引模块,其索引速度必然慢于NumPy。10)可操作性Pandas支持分组统计(通过groupby()方