徐文昭
(四川建筑職業(yè)技術(shù)學院,四川 德陽 618000)
近些年來,伴隨著網(wǎng)絡技術(shù)與云計算技術(shù)的蓬勃飛速發(fā)展,社會各個領(lǐng)域的數(shù)據(jù)匯聚到網(wǎng)絡中來,網(wǎng)絡數(shù)據(jù)時時刻刻呈現(xiàn)爆炸性增長,我們生活在數(shù)據(jù)的汪洋大海中,大數(shù)據(jù)時代已然到來。面對紛繁復雜、日益增長的海量數(shù)據(jù),能夠從中發(fā)現(xiàn)并挖掘有規(guī)律、有價值的信息——數(shù)據(jù)分析處理,顯得越來越重要。Python因其語法簡單精練、擁有巨大且活躍的科學計算社區(qū)、強大的通用編程能力、人工智能時代可作為通用語言及可對接其他語言等優(yōu)勢特性,成為數(shù)據(jù)分析處理的首要編程語言。作為Python一個重要的庫,Pandas是一款基于numpy、專門為了解決數(shù)據(jù)分析任務的工具,其間不僅納入了大量的庫和一些標準的數(shù)據(jù)模型,而且提供了高效操作大型數(shù)據(jù)集所需的工具,被廣泛應用到許多領(lǐng)域,包括經(jīng)濟、統(tǒng)計和分析等學術(shù)及商業(yè)領(lǐng)域。
Python的Pandas庫里有兩個非常重要的數(shù)據(jù)結(jié)構(gòu):Series和DataFrame。其中,前者是一維的數(shù)據(jù)結(jié)構(gòu),后者是二維的、表格型的數(shù)據(jù)結(jié)構(gòu)。我們可以把文件里的數(shù)據(jù)讀入程序進行處理,處理過程中涉及索引及切片操作。這兩種數(shù)據(jù)類型的對象都支持索引及切片操作,DataFrame對象的元素可以通過索引和切片來訪問和修改,就像Python內(nèi)置的容器對象一樣。
從表面上來看,因為Series類對象屬于一維數(shù)據(jù)結(jié)構(gòu),它使用索引和切片的方式與NumPy數(shù)組索引和切片非常類似,但Series的索引值不只是整數(shù)。但對于DataFrame來說,索引和切片的使用方式就與列表大不一樣了。DataFrame結(jié)構(gòu)不僅包含行索引,也包含列索引。其中,行索引是通過index屬性進行獲取的,列索引是通過columns屬性進行獲取的。DataFrame里每列數(shù)據(jù)都是一個Series對象,這樣,可以使用列索引進行獲取。其中有一種特別的索引——布爾型索引。布爾型索引指的是將一個其元素為布爾型數(shù)據(jù)的Series對象或DataFrame對象作為模板篩選數(shù)據(jù),返回與模板中元素值為True位置對應的元素。
在一張Excel表里,存儲著若干行數(shù)據(jù),分散記錄了各組員工工作的完成次數(shù)(具體如表1所示),現(xiàn)在要求分組統(tǒng)計篩選出各組完成次數(shù)最多的員工數(shù)據(jù)行。
表1 各組員工工作完成的次數(shù)
我們很可能不由自主地想到了Excel里的分類匯總以及數(shù)據(jù)透視功能?!胺诸悈R總”是對同類別的數(shù)據(jù)進行統(tǒng)計匯總,是將相同類別的數(shù)據(jù)放在一起,然后進行求和、最大(小)值、計數(shù)和求平均值等匯總運算,是數(shù)據(jù)分析的重要手段,但是,如果借助Excel本身自帶的分類匯總以及數(shù)據(jù)透視功能來解決本文提出的問題,是無法完成這個任務的,它們只能呈現(xiàn)出各個類別(分組)的統(tǒng)計值,沒法給出統(tǒng)計值所在數(shù)據(jù)行的完整數(shù)據(jù)信息。據(jù)此,我們探討采用Python的Pandas庫來實現(xiàn),可有兩種方法。
Python的Pandas庫里有兩個非常重要的數(shù)據(jù)結(jié)構(gòu):Series和DataFrame。其中,前者是一維的數(shù)據(jù)結(jié)構(gòu),后者是二維的、表格型的數(shù)據(jù)結(jié)構(gòu)??梢园褦?shù)據(jù)表數(shù)據(jù)讀入程序以DataFrame類型表示,然后據(jù)此可以進行分組聚合以及篩選,最后形成最終結(jié)果。筆者調(diào)試實驗程序是在Jupyter Notebook上進行的。Jupyter Notebook(交互式筆記本)是一個支持實時代碼、數(shù)學方程、可視化和Markdown的Web應用程序,它支持四十多種計算機編程語言,對于數(shù)據(jù)分析來說,這個Web應用程序最大的優(yōu)點是可以重現(xiàn)整個數(shù)據(jù)分析過程,并將說明文字、代碼、圖表、公式和結(jié)論都整合在一個文檔里面,用戶可以通過電子郵件(E-mail)、Dropbox、GitHub和Jupyter Notebook View將分析結(jié)果分享給其他人。
import pandas as pd # 導入pandas庫
df = pd . read_excel ( ‘G : test1 . xlsx’) # 從存在盤上的Excel表讀取數(shù)據(jù)到程序,變量df的數(shù)據(jù)類型為DataFrame
dm = df . groupby (‘組別’) . max ( ) #按照“組別”分組并聚合數(shù)據(jù),篩選出各組最大值
dmax = pd . DataFrame ( ) # 新建一個DataFrame變量,以保存符合條件的行數(shù)據(jù)
# 循環(huán)語句,以dm行索引“組別”和列索引“完成次數(shù)”與原始數(shù)據(jù)集df匹配,以篩選出符合條件的數(shù)據(jù)行
foriindm . index:
m = df [ ( df [‘組別’]==I ) & ( df [‘完成次數(shù)’] = = dm [‘完成次數(shù)’] [ i ] ) ]
dmax = dmax . append ( m )
dmax # 打印輸出結(jié)果數(shù)據(jù)集
運行該程序,得到各組完成次數(shù)最多的員工信息,如表2所示。
表2 各組完成次數(shù)最多的員工信息(方法一)
import pandas as pd #導入pandas庫
df = pd . read _ excel (‘ G : test1 . xlsx ’) #從存在盤上的Excel表讀取數(shù)據(jù)到程序,df的數(shù)據(jù)類型為DataFrame
dmax = df [df . groupby [‘組別’] . transform. max ( ) [‘完成次數(shù)’] = = df[‘完成次數(shù)’]]
dmax #打印輸出結(jié)果數(shù)據(jù)集
運行該程序,得到各組完成次數(shù)最多的員工信息,如表3所示。
表3 各組完成次數(shù)最多的員工信息(方法二)
可以看出,兩種方法運行程序得到的結(jié)果數(shù)據(jù)集是相同的,但相對方法一的程序,方法二里面的程序代碼非常短小精煉。該程序應用到了transform()方法。一般來說,在對數(shù)據(jù)集進行聚合運算的時候,返回的數(shù)據(jù)集的形狀(shape)與被分組數(shù)據(jù)集的形狀是不同的,也就是說,一般返回的數(shù)據(jù)集的數(shù)據(jù)行數(shù)量小于原來數(shù)據(jù)集的數(shù)據(jù)行數(shù)量。如果希望保持與原來的數(shù)據(jù)集形狀相同,那么可以通過transform()方法來實現(xiàn)。該方法的語法格式如下:
transform ( func , * args , ** kwargs )
上述方法中只有一個func參數(shù),表示操作pandas對象的函數(shù),比如,剛用到的max函數(shù)。transform()方法返回的結(jié)果有兩種:①可以在本組列上進行廣播的標量值(如max);②可以是與分組大小相同的結(jié)果數(shù)組。通過transform()方法操作分組時,transform()方法會把func函數(shù)應用到各個分組中,并且將結(jié)果放在適當?shù)奈恢?。如此,當進行篩選最值數(shù)據(jù)行時,不必使用循環(huán)遍歷,通過兩個等行數(shù)的數(shù)據(jù)集比較運算,得到等行數(shù)的新數(shù)據(jù)集,相應位置上的元素被賦予布爾類型的值,通過數(shù)據(jù)集的布爾索引,就獲得了最終的最值數(shù)據(jù)行形成的新數(shù)據(jù)集,這就是我們想要的結(jié)果集。
數(shù)據(jù)處理分析是海量數(shù)據(jù)里尋找發(fā)現(xiàn)信息規(guī)律的重要手段。Pandas是一款基于numpy、專門為了解決數(shù)據(jù)分析任務的工具、作為Python的一個重要的庫,其間不僅納入了大量的庫和一些標準的數(shù)據(jù)模型,而且提供了高效操作大型數(shù)據(jù)集所需的工具,被廣泛應用到許多領(lǐng)域,包括經(jīng)濟、統(tǒng)計和分析等學術(shù)及商業(yè)領(lǐng)域。筆者通過使用Python的Pandas庫的編程方式對結(jié)合數(shù)據(jù)分組統(tǒng)計“最值”記錄問題進行了研究,得出了優(yōu)化的程序?qū)崿F(xiàn)方法。通過研究發(fā)現(xiàn),采用編程方式,運用具有專業(yè)的數(shù)據(jù)處理分析特長的Python語言及Pandas庫,能解決看似復雜的數(shù)據(jù)處理分析問題。我們應該重視一些看起來平凡無奇的方法,如transform()方法,如能被合理地運用,就可以減省大量程序代碼,讓程序更精煉強悍、運行起來效率更高。