華振宇



摘要: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.
【通聯編輯:謝媛媛】