徐文昭
(四川建筑職業技術學院,四川 德陽 618000)
近些年來,伴隨著網絡技術與云計算技術的蓬勃飛速發展,社會各個領域的數據匯聚到網絡中來,網絡數據時時刻刻呈現爆炸性增長,我們生活在數據的汪洋大海中,大數據時代已然到來。面對紛繁復雜、日益增長的海量數據,能夠從中發現并挖掘有規律、有價值的信息——數據分析處理,顯得越來越重要。Python因其語法簡單精練、擁有巨大且活躍的科學計算社區、強大的通用編程能力、人工智能時代可作為通用語言及可對接其他語言等優勢特性,成為數據分析處理的首要編程語言。作為Python一個重要的庫,Pandas是一款基于numpy、專門為了解決數據分析任務的工具,其間不僅納入了大量的庫和一些標準的數據模型,而且提供了高效操作大型數據集所需的工具,被廣泛應用到許多領域,包括經濟、統計和分析等學術及商業領域。
Python的Pandas庫里有兩個非常重要的數據結構:Series和DataFrame。其中,前者是一維的數據結構,后者是二維的、表格型的數據結構。我們可以把文件里的數據讀入程序進行處理,處理過程中涉及索引及切片操作。這兩種數據類型的對象都支持索引及切片操作,DataFrame對象的元素可以通過索引和切片來訪問和修改,就像Python內置的容器對象一樣。
從表面上來看,因為Series類對象屬于一維數據結構,它使用索引和切片的方式與NumPy數組索引和切片非常類似,但Series的索引值不只是整數。但對于DataFrame來說,索引和切片的使用方式就與列表大不一樣了。DataFrame結構不僅包含行索引,也包含列索引。其中,行索引是通過index屬性進行獲取的,列索引是通過columns屬性進行獲取的。DataFrame里每列數據都是一個Series對象,這樣,可以使用列索引進行獲取。其中有一種特別的索引——布爾型索引。布爾型索引指的是將一個其元素為布爾型數據的Series對象或DataFrame對象作為模板篩選數據,返回與模板中元素值為True位置對應的元素。
在一張Excel表里,存儲著若干行數據,分散記錄了各組員工工作的完成次數(具體如表1所示),現在要求分組統計篩選出各組完成次數最多的員工數據行。

表1 各組員工工作完成的次數
我們很可能不由自主地想到了Excel里的分類匯總以及數據透視功能。“分類匯總”是對同類別的數據進行統計匯總,是將相同類別的數據放在一起,然后進行求和、最大(小)值、計數和求平均值等匯總運算,是數據分析的重要手段,但是,如果借助Excel本身自帶的分類匯總以及數據透視功能來解決本文提出的問題,是無法完成這個任務的,它們只能呈現出各個類別(分組)的統計值,沒法給出統計值所在數據行的完整數據信息。據此,我們探討采用Python的Pandas庫來實現,可有兩種方法。
Python的Pandas庫里有兩個非常重要的數據結構:Series和DataFrame。其中,前者是一維的數據結構,后者是二維的、表格型的數據結構。可以把數據表數據讀入程序以DataFrame類型表示,然后據此可以進行分組聚合以及篩選,最后形成最終結果。筆者調試實驗程序是在Jupyter Notebook上進行的。Jupyter Notebook(交互式筆記本)是一個支持實時代碼、數學方程、可視化和Markdown的Web應用程序,它支持四十多種計算機編程語言,對于數據分析來說,這個Web應用程序最大的優點是可以重現整個數據分析過程,并將說明文字、代碼、圖表、公式和結論都整合在一個文檔里面,用戶可以通過電子郵件(E-mail)、Dropbox、GitHub和Jupyter Notebook View將分析結果分享給其他人。
import pandas as pd # 導入pandas庫
df = pd . read_excel ( ‘G : test1 . xlsx’) # 從存在盤上的Excel表讀取數據到程序,變量df的數據類型為DataFrame
dm = df . groupby (‘組別’) . max ( ) #按照“組別”分組并聚合數據,篩選出各組最大值
dmax = pd . DataFrame ( ) # 新建一個DataFrame變量,以保存符合條件的行數據
# 循環語句,以dm行索引“組別”和列索引“完成次數”與原始數據集df匹配,以篩選出符合條件的數據行
foriindm . index:
m = df [ ( df [‘組別’]==I ) & ( df [‘完成次數’] = = dm [‘完成次數’] [ i ] ) ]
dmax = dmax . append ( m )
dmax # 打印輸出結果數據集
運行該程序,得到各組完成次數最多的員工信息,如表2所示。

表2 各組完成次數最多的員工信息(方法一)
import pandas as pd #導入pandas庫
df = pd . read _ excel (‘ G : test1 . xlsx ’) #從存在盤上的Excel表讀取數據到程序,df的數據類型為DataFrame
dmax = df [df . groupby [‘組別’] . transform. max ( ) [‘完成次數’] = = df[‘完成次數’]]
dmax #打印輸出結果數據集
運行該程序,得到各組完成次數最多的員工信息,如表3所示。

表3 各組完成次數最多的員工信息(方法二)
可以看出,兩種方法運行程序得到的結果數據集是相同的,但相對方法一的程序,方法二里面的程序代碼非常短小精煉。該程序應用到了transform()方法。一般來說,在對數據集進行聚合運算的時候,返回的數據集的形狀(shape)與被分組數據集的形狀是不同的,也就是說,一般返回的數據集的數據行數量小于原來數據集的數據行數量。如果希望保持與原來的數據集形狀相同,那么可以通過transform()方法來實現。該方法的語法格式如下:
transform ( func , * args , ** kwargs )
上述方法中只有一個func參數,表示操作pandas對象的函數,比如,剛用到的max函數。transform()方法返回的結果有兩種:①可以在本組列上進行廣播的標量值(如max);②可以是與分組大小相同的結果數組。通過transform()方法操作分組時,transform()方法會把func函數應用到各個分組中,并且將結果放在適當的位置。如此,當進行篩選最值數據行時,不必使用循環遍歷,通過兩個等行數的數據集比較運算,得到等行數的新數據集,相應位置上的元素被賦予布爾類型的值,通過數據集的布爾索引,就獲得了最終的最值數據行形成的新數據集,這就是我們想要的結果集。
數據處理分析是海量數據里尋找發現信息規律的重要手段。Pandas是一款基于numpy、專門為了解決數據分析任務的工具、作為Python的一個重要的庫,其間不僅納入了大量的庫和一些標準的數據模型,而且提供了高效操作大型數據集所需的工具,被廣泛應用到許多領域,包括經濟、統計和分析等學術及商業領域。筆者通過使用Python的Pandas庫的編程方式對結合數據分組統計“最值”記錄問題進行了研究,得出了優化的程序實現方法。通過研究發現,采用編程方式,運用具有專業的數據處理分析特長的Python語言及Pandas庫,能解決看似復雜的數據處理分析問題。我們應該重視一些看起來平凡無奇的方法,如transform()方法,如能被合理地運用,就可以減省大量程序代碼,讓程序更精煉強悍、運行起來效率更高。