更新時(shí)間:2022-10-07 來(lái)源:黑馬程序員 瀏覽量:
在Pandas中,大多數(shù)據(jù)是以便于操作的DataFrame形式展現(xiàn)的,這樣可以很容易地獲取每行或每列的數(shù)據(jù)。不過(guò)有些時(shí)候,需要將DataFrame對(duì)象轉(zhuǎn)換為Series對(duì)象。為此,Pandas提供了數(shù)據(jù)重塑的一些功能,包括重塑層次化索引和軸向轉(zhuǎn)換,用于轉(zhuǎn)換一個(gè)表格或向量的結(jié)構(gòu),使其更便于進(jìn)行下一步的分析。接下來(lái),筆者先來(lái)介紹一下數(shù)據(jù)重塑的相關(guān)功能進(jìn)行詳細(xì)地介紹。
Pandas中重塑層次化索引的操作主要是stack()方法和unstack()方法,前者是將數(shù)據(jù)的列“旋轉(zhuǎn)”為行,后者是將數(shù)據(jù)的行“旋轉(zhuǎn)”為列。
stack()方法可以將數(shù)據(jù)的列索引轉(zhuǎn)換為行索引,其語(yǔ)法格式如下:
DataFrame.stack(level=-1, dropna=True)
上述方法中部分參數(shù)表示的含義如下:
(1)level:表示操作內(nèi)層索引。若設(shè)為0,表示操作外層索引,默認(rèn)為-1。
(2)dropna:表示是否將旋轉(zhuǎn)后的缺失值刪除,若設(shè)為True,則表示自動(dòng)過(guò)濾缺失值,設(shè)置為False則相反。
假設(shè)現(xiàn)在有一個(gè)DataFrame類對(duì)象df,它只有單層索引,如果希望將其重塑為一個(gè)具
有兩層索引結(jié)構(gòu)的對(duì)象result,也就是說(shuō)將列索引轉(zhuǎn)換成內(nèi)層行索引,則重塑前后的效果如圖4-22所示。
圖4-22 DataFrame對(duì)象重塑為Series對(duì)象
接下來(lái),我們通過(guò)一個(gè)示例來(lái)演示如何使用stack()方法將df對(duì)象轉(zhuǎn)換成result,具體代碼如下:
In [33]: import pandas as pd df=pd.DataFrame({'A':['A0','A1','A2'], 'B':['B0','B1','B2']} # 將df進(jìn)行重塑 result=df.stack() result Out[33]: 0 A A0 B B0 1 A A1 B B1 2 A A2 B B2
上述代碼中,首先創(chuàng)建了一個(gè)DataFrame類的對(duì)象df,然后讓df對(duì)象調(diào)用stack()方法進(jìn)行重塑,表明df對(duì)象的列索引會(huì)轉(zhuǎn)換成行索引。從輸出結(jié)果看出,result對(duì)象具有兩層行索引。
使用type()函數(shù)來(lái)查看result的類型,代碼如下:
In [34]: type(result) Out[34]: pandas.core.series.Series
從輸出結(jié)果可以看出,DataFrame對(duì)象已經(jīng)被轉(zhuǎn)換成一個(gè)Series對(duì)象。
unstack()方法可以將數(shù)據(jù)的行索引轉(zhuǎn)換為列索引,其語(yǔ)法格式如下:
DataFrame.unstack(level=-1, fill_value=None)
上述方法中部分參數(shù)表示的含義如下:
(1)level:默認(rèn)為-1,表示操作內(nèi)層索引,0表示操作外層索引。
(2)fill_value:若產(chǎn)生了缺失值,則可以設(shè)置這個(gè)參數(shù)用來(lái)替換NaN。
接下來(lái),將前面示例中重塑的Series對(duì)象“恢復(fù)原樣”,轉(zhuǎn)變成DataFrame對(duì)象,具體代碼如下:
In [35]: import pandas as pd df=pd.DataFrame({'A':['A0','A1','A2'], 'B':['B0','B1','B2']} res=df.stack() # 將df重塑為Series對(duì)象 res.unstack() # 將Series對(duì)象轉(zhuǎn)換成df Out[35]: A B 0 A0 B0 1 A1 B1 2 A2 B2
上述示例中,首先創(chuàng)建了一個(gè)DataFrame類對(duì)象df,然后使用stack()方法將其重塑為Series類對(duì)象,最后再使用unstack()方法將其重塑回DataFrame類對(duì)象。