pandas中DataFrame的stack()、unstack()和pivot()方法的對比


 pandas中,這三種方法都是用來對表格進行重排的,其中stack()是unstack()的逆操作。某種意義上,unstack()方法和pivot()方法是很像的,主要的不同在於,unstack()方法是針對索引或者標簽的,即將列索引轉成最內層的行索引;而pivot()方法則是針對列的值,即指定某列的值作為行索引,指定某列的值作為列索引,然后再指定哪些列作為索引對應的值。因此,總結起來一句話就是:unstack()針對索引進行操作,pivot()針對值進行操作。但實際上,兩者在功能往往可以互相實現。

        unstack(self, level=-1, fill_value=None)、pivot(self, index=None, columns=None, values=None,對比這兩個方法的參數,這里要注意的是,對於pivot(),如果參數values指定了不止一列作為值的話,那么生成的DataFrame的列索引就會出現層次索引,最外層的索引為原來的列標簽;unstack()沒有指定值的參數,會把剩下的列都作為值,即把剩下的列標簽都作為最外層的索引,每個索引對應一個子表。

stack()列轉行:原本的一個字段的數據放在一'行'上
unstack()行轉列:原本的一'行'數據放在一個字段上,(默認操作為最內層,可用分層級別的編號或名稱對其他級別進行unstack)

       pivot()方法其實比較容易理解,就是指定相應的列分別作為行、列索引以及值。下面我們通過幾張原理圖詳細說明stack()和unstack(),最后再通過一個具體的例子來對比stack()、unstack()和pivot()這三種方法。

       先看stack(),如圖。stack()是將原來的列索引轉成了最內層的行索引,這里是多層次索引,其中AB索引對應第三層,即最內層索引。

       再看unstack(),如圖。顯然,unstack()是stack()的逆操作,這里把最內層的行索引還原成了列索引。但是unstack()中有一個參數可以指定旋轉第幾層索引,比如unstack(0)就是把第一層行索引轉成列索引,但默認的是把最內層索引轉層列索引。

       最后,我們在看一個具體的例子。首先我們構造一個如下圖的DataFrame對象,現在目的是要把ticker列作為行索引,tradeDate列作為列索引,closeIndex作為值,生成一個新的表格。這可以通過unstack()和pivot()分別實現,我們先看unstack()如何實現。

       我們之前說過,unstack()是針對索引的,因此,我們需要先把ticker和tradeDate這兩列的值設置為索引,然后才能對其進行操作,代碼如下。利用DataFrame的set_index()方法,並把需要作為index的兩列標簽的列表作為參數傳遞給這個方法,就可以把這兩列設置為行索引。

       設置成行索引后,我們可以對這個對象用unstack()方法,默認把最內層轉為列索引,代碼如下。如圖輸入的結果,已經實現了我們目的,其中closeIndex作為列的最外層索引出現,如果我們再加一條代碼df_daily_industry_symbol.set_index(['tradeDate','ticker']).unstack()['closeIndex'],則就會得到closeIndex索引下的表格。

       最后,我們看下如何用pivot()實現這個目的,代碼如下。顯然,用pivot()方法簡單很多,可以直接通過設置相關參數實現。但是這里由於ticker和tradeDate最初就是值而不是索引,索引可以直接這樣一行代碼解決,若原數據中,這兩列本來就是多層次的索引,那么用unstack()就會簡單很多,因此,用什么方法取決於原數據的構成。

 

再舉個栗子:

首先構建數據幀

data = pd.DataFrame(np.arange(12).reshape((3,4)), index = pd.Index(['a','b','c'], name='state'), columns=pd.Index(['one','two','three','four'], name='number')) data 
 
image.png
data.stack() 
 
image.png
data.stack().index #state的級別為0,number的級別為1,unstack()默認為0 
 
image.png
data.stack().unstack(0) 
 
image.png
data.stack().unstack(1) 
 
image.png


作者:我住永安當
鏈接:https://www.jianshu.com/p/f72415a7a083
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM