华振宇
摘要:Pandas和NumPy作为Python数据分析框架下的两个第三方库,已成为数据科学领域相关工作的常见工具和技术。文章在简要介绍Pandas和NumPy特点的基础之上,从开源社区支持、基础数据结构、内存占用、数据兼容性、性能表现、数据对象、数据类型、访问方法、索引功能、可操作性、文件存储、使用场景、机器学习和人工智能中的应用等方面,细致比较了二者之间的异同,以期帮助研究者更加合理地选择和使用这两个第三方库。
关键词:Pandas;NumPy;Python
中图分类号:TP311 文献标识码:A
文章编号:1009-3044(2023)01-0071-03
1 引言
我国《“十四五”数字经济规划》中明确提出要“充分发挥数据要素作用”,数据科学相关的研究工作在我国当前的发展形势可谓如火如荼。Python作为近年持续流行的主流编程语言之一,由于其语法简洁、功能强大,且具有能够提供完整数据分析框架的成熟开发生态,早已成为人工智能、大数据、机器学习等领域研究工作的常见工具和选择[1-2]。本文在扼要介绍Python生态中的两个科学计算库:NumPy和Pandas的基础之上,简明概括二者之间的异同,以期能够帮助读者迅速理解和掌握这两个工具的使用,并以此为基础开展自己的数据研究工作。
2 NumPy及其简介
NumPy(Numerical Python)是一个开源的Python科学计算库,是Python生态中最重要的底层支持库之一,支持快速的数组和矩阵运算[3]。NumPy 1.0发布于2006年,目前的最新版本是1.23。NumPy具有如下特点:
1) 使用数组作为其内部数据结构,而非Python列表中所使用的对象指针,因此其访问性能远远超出原生的Python列表结构;
2) 代码采用C/C++实现,具有极为优异的运行效率;
3) 通常用于组织同构(质)的数据对象;
4) 可以表达一维或多维数组;
5) 支持线性代数、数理统计、多项式、傅里叶变换等多种数学计算;
6) 支持数组的组合、分割、形状改变、排序等操作;
7) 当参与运算的两个数组形状不一致时,将按照广播规则进行运算,规则如下:
①参加运算的数组都向维数最大的数组看齐,维数较小的数组在前面加1补齐;
②结果数组的形状取各运算数组各轴的最大值;
③若运算数组某轴长度为1,则该轴可扩充为结果数组的对应轴的长度,否则不能扩充;
④检查扩充后所有运算数组的各轴长度,全部相同则符合规则可以计算,否则违反规则无法计算。
8) 已被其他第三方库:如Pandas、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所示:
2) 使用基本索引获取其中某个数据
NumPy中的索引操作和Python中的原生列表类型相似。索引总是从0开始编号,并且书写于一对中括号内部。假设想从如上矩阵中访问第三行第二列的元素(7) ,应使用如下表达式:
arr[2][1]
3) 使用切片获取数据子集
如果需要一次性地获取多个数据,则应使用切片操作。在NumPy中,需要分别指定行的范围和列的范围。依然以上文矩阵为例,如果需要访问第一行和第二行,第二列和第三列共同构成的数据子集,可使用如下表达式:
arr[0:2, 1:3]
当使用a:b这样的形式表达一个特定范围时,具体的取值范围应该是a, a+1, ... , b-1(数值b应该被排除在外)。最终的输出结果如图2所示:
4) 矩阵的转置操作
正如前文提及,NumPy内置大量的矩阵运算函数。方法transpose()直接返回给定矩阵的转置矩阵。输出结果如图3所示:
3 Pandas及其简介
Pandas是目前Python生态中最常用的数据分析工具库之一。该库以NumPy为基础,增加了标签支持,整合了对数据集的读取、清洗、转换、分析、统计、绘图等一系列工作流程,能够高效地处理和分析各类数据[5]。Pandas提供了两种最基本的数据结构:序列(Series) 和数据框(DataFrame) ,分别用于带标签的一维数组和二维数组的表示。Pandas具有如下特点:
1) 能够处理残缺数据;
2) 支持可视化,能够生成常见的图表,如饼图、直方图、关联图等;
3) 强大的分组和排序功能;
4) 支持对各种主流文件格式的导入导出,如csv,hdf5,xlsx;
5) 支持数据的合并、清洗和索引重建;
6) 内置loc和iloc取数器获取数据子集,其中loc允许用户通过标签获取子集,而iloc则借助整数索引下标;
7) 通过groupby()方法支持分组统计;
8) 通过apply()方法,可由匿名lambda函数对各行或各列进行数据变换;
9) 提供内置函数可对空值、缺失数据项进行清洗。
关键代码示例:
假定已通过import pandas as np及 from pandas import Series, DataFrame进行导入。
①创建数据框对象
以前述创建的二维数组arr为基础,构造一个携带行标签和列标签的四行三列的数据框对象。代码如下:
df = DataFrame(arr, index=list('abcd'), columns=list('xyz'))
输出数据框如图4所示:
②通过标签访问数据框中的某个数据
依然以访问第三行第二列的数值7为例,其表达式应为:
df.loc['c']['y'] 或 df.loc['c', 'y']
③使用基于标签的切片获取子数据框
与NumPy相似,Pandas中同样支持切片——而且提供基于标签的切片。当使用整数索引切片时,冒号后的数字不被包括在内;如果使用标签切片,冒号前后的标签都应包括在内。在以上数据框中,如欲获取包含第一、二行,第二、三列构成的子数据框,则可使用如下表达式:
df.loc['a':'b', 'y':'z']
当然,Pandas提供iloc作为基于整数索引的切片访问方式,代码为:
df.iloc[0:2, 1:3] (与NumPy中的切片相似)
获取的子数据框输出如图5所示:
④排序
Pandas中排序可以作用于索引或数据值。对行或列索引排序时使用sort_index()方法,按数据值排序时使用sort_values()方法。排序后返回一个有序的新对象,而不直接改变原数据框的排列顺序。使用sort_index()方法时,有两个常见的可选参数:ascending和axis。ascending默认取值为True表示按升序排序,若设为False则按降序排列。axis默认取值为0表示对行索引进行排序,若设为1则对列索引进行排序。假如对数据框df的列索引进行降序排序,则按如下方式调用函数:
df.sort_index(ascending=False, axis=1)
运行以上代码输出如图6所示:
sort_values()同样支持ascending和axis参数。axis默认取值为0表示对列进行排序,若设为1则对行进行排序。此外,由于数据框存在多行或者多列,必须通过by参数指定参与排序的行或列。假如对数据框df按x列数据降序排列,则应按如下方式进行函数调用:
df.sort_values(ascending=False, by='x')
运行以上代码输出如图7所示:
4 Pandas和NumPy的比较
Pandas基于NumPy实现,同时广泛应用于数据科学相关领域工作,二者之间可谓既有区别又有联系。以下将从开源社区支持、基础数据结构、内存占用、数据兼容性、性能表现等13个方面,逐一对Pandas和NumPy进行细致的比较:
1) 开源社区支持
Pandas和NumPy均为开源代码库,因此其开源社区的研发水平、活跃程度对于代码库的后续发展和维护,都起着至关重要的作用。表1總结了截止笔者撰写本文时这两个代码库在GitHub上的相关统计数据:
由此不难发现:目前这两个代码库在开源社区都享有较高的关注度和活跃度,预期在将来依然可以得到良好的发展与维护。
2) 基础数据结构
Pandas提供的基础数据结构是序列(Series) 和数据框(DataFrame) 。序列是带有标签的一维数组;而数据框则可视为由多个具有相同标签的序列构成的二维数组。数据框可同时附带行标签和列标签。NumPy则以N维数组(ndarray) 作为基础数据结构。
3) 内存占用
NumPy的内存占用要小于Pandas。原因在于:Pandas依然使用对象指针表示序列和数据框中的数据。此外,Pandas还需要额外存储数据的标签(索引)。
4) 数据兼容性
Pandas基于NumPy实现,适用于任何扁平(表格)结构数据的处理。而NumPy更常见于纯粹的数值或矩阵运算。
5) 性能表现
二者均提供了基于IRIS数据集的性能测试报告。测试结果表明,当数据记录条数在5万以下时,NumPy具有更好的运算性能。如果超出50万条记录,Pandas的表现更胜一筹。如果数据规模介于5万和50万条记录之间,关于二者之间孰优孰劣尚无明显定论。由此可见:当数据集的规模较小时,NumPy能够提供更好的性能表现;反之,理应优先考虑Pandas。
6) 数据对象
Pandas不仅提供序列和数据框作为表达一维和二维数据结构的基础数据类型,甚至还设计了表达三维数据结构的Panel数据类型;然后在Pandas的相关实践中鲜少遇见对Panel类型的使用。而NumPy则可支持N维数组。
7) 数据类型
NumPy中的数组和Pandas中的序列/数据框类型均可作为字符串、整数、浮点数、列表等的容器类型。不同之处在于:Pandas中,数据框的数据元素类型可以是异质的——换言之,每一列均可定义自己的特有类型。而NumPy中的数组类型,其全部数据元素拥有相同的数据类型——换言之,所有数据必须同质。
8) 访问方法
无论是在NumPy还是Pandas中,都能通过整数索引访问某个特定的数据、切片或者数据子集。由于Pandas集成了标签特性,还可以通过指定行标签或者列标签的方式来访问数据——由于标签本身能够体现数据语义,这一方式对于编程者来说无疑更为友好。
9) 索引功能
NumPy本质上使用数组实现,因此自带数组的快速索引这一天然优势;而Pandas基于NumPy实现,且必须在此基础上新增支持行标签和列标签的索引模块,其索引速度必然慢于NumPy。
10) 可操作性
Pandas支持分组统计(通过groupby()方法)、多级排序这样的复杂操作,其操作能力可类比标准查询语言SQL;而NumPy提供的操作函数和方法,全部限于数学和矩阵运算。
11) 文件存储
无论是Pandas还是NumPy,都支持对于外部文件的导入导出——例如对于主流的数据文件格式csv,二者均能提供完美支持。但相较于NumPy,Pandas支持的文件類型更为丰富,还包括:xlsx,HDF5甚至某些数据库格式。
12) 使用场景
Pandas常见于数据分析、数据管理和数据可视化等使用场景。在众多数据科学相关项目的数据准备阶段,都能见到Pandas的广泛使用[6]。而NumPy更常见于纯粹的数值计算领域,尤其是其内置的大量矩阵操作相关函数和方法,能够大大简化矩阵运算的编程工作量[7]。
13) 在机器学习和人工智能中的使用
在机器学习的过程中,通常可以分为数据准备和数据建模两个阶段。在先期的数据准备阶段中,常常能够看到Pandas大显身手,高效完成数据的清洗和处理。而在人工智能的经典应用中,必须通过NumPy数组对图形、视频等对象进行矩阵化表示。只有经过数组化表示后,才能作为输入供TensorFlow或Scikit后续进一步使用。
5 结束语
本文通过对比Pandas和NumPy这两个数据科学领域中常见的第三方库,尝试帮助相关研究者和工作人员迅速厘清二者之间的区别与联系,从而能在自己的项目和工作中快速、准确地选择恰当的方法和工具,顺利推进研究工作的开展。
参考文献:
[1] 嵩天,礼欣,黄天羽.Python语言程序设计基础[M].2版.北京:高等教育出版社,2017.
[2] 高鸿斌,申肖阳.Python数据分析技术综述[J].邯郸职业技术学院学报,2018,31(4):49-51.
[3] 赵军,刘文婷.Python医学数据分析入门[M].北京:人民邮电出版社,2022.
[4] 肖慧明.Python技术在数据可视化中的研究综述[J].网络信息工程,2021(13):87-89.
[5] 陈都,徐峰.浅谈Python在创伤流行病学数据分析中的应用[J].创伤外科杂志,2022,24(7):481-485.
[6] 田学成,韩宁.公安工作疫情流调大数据建模和安全分析[J].网络安全与数据治理,2022,41(10):31-36.
[7] 胡孟柯.基于Numpy的离散Bayes网络推理[J].电脑编程技巧与维护,2021(8):24-26.
【通联编辑:谢媛媛】