苦于在網(wǎng)上找不到對與unstack與stack的很直觀對于我們這些小白很友好的解釋,在自行研究一番后树碱,決定自己寫一個记罚,用詞不會很專業(yè),只希望以最簡單最直白的方式來解釋望迎。
首先將我兩個基友當(dāng)做祭品獻上障癌,創(chuàng)建一個數(shù)據(jù)組:
import pandas as pd
data1={'姓名':['陳冠文','陳冠文','陳冠文','劉力','劉力','劉力','陳俞','陳俞','陳俞'],
'屬性':['顏值','幽默','運動','顏值','幽默','運動','顏值','幽默','運動'],
'得分':[100,100,100,80,80,70,50,50,30]}
df=DataFrame(data1)
df = df.set_index(['姓名','屬性'])
df
將姓名和屬性設(shè)置為索引,如下圖:
對于unstack和stack的官方解釋辩尊,可以自行查閱涛浙。
我只說下我自己的理解:
stack簡單說就是把columns轉(zhuǎn)成index
unstack就是把index轉(zhuǎn)成columns
再甚至,可以理解為:
stack是一個‘逆時針’的旋轉(zhuǎn)
unstack是一個‘順時針’旋轉(zhuǎn)
關(guān)于這個順逆時針我在下面會說到。
首先先來一個unstack的變化:
在不設(shè)置level的情況下轿亮,轉(zhuǎn)化過程就是我箭頭方向的移動過程:
df.unstack()
默認(rèn)是最里層的(屬性)疮薇,轉(zhuǎn)到columns的最里層,也就是得分的‘下面’我注,
它把index轉(zhuǎn)變成了一個columns按咒,所以看成是一個‘順時針’的旋轉(zhuǎn)。
同理df.unstack().stack():
將columns轉(zhuǎn)化為了index但骨,可看成‘逆時針’的旋轉(zhuǎn)励七。
明白了這個最基本的原理后,接下來進行一些變化:
進行兩次unstack:
第一次:df.unstack()
第二次:df.unstack().unstack()
出現(xiàn)了不一樣的變化:
它轉(zhuǎn)變?yōu)榱艘粋€一維數(shù)據(jù)組(由于是中文奔缠,有點不太對齊呀伙,大致能看出,得分一欄添坊,屬相往下一欄剿另,姓名往下一欄)
你可以粗暴的理解為:pandas把它‘放平了’!
得分贬蛙,屬性雨女,姓名就是index,columns沒有了阳准,這會有助于你理解接下來的‘翻轉(zhuǎn)’氛堕!
此時看這張圖:由于‘只有index,沒有columns’野蝇,如果再進行stack逆時針旋轉(zhuǎn)讼稚,columns就沒有東西給你翻轉(zhuǎn)了。
報錯了绕沈!
此時锐想,只能進行unstack翻轉(zhuǎn):
df.unstack().unstack().unstack()
原理還是一樣,默認(rèn)最里層姓名一欄順時針旋轉(zhuǎn)到了columns一欄
再來一次:df.unstack().unstack().unstack().unstack()
最里面的屬性轉(zhuǎn)到了columns的最里面乍狐,姓名一欄被頂?shù)健饷妗チ?/p>
理解完旋轉(zhuǎn)過程后,接下來就是用level指定要旋轉(zhuǎn)的列或行藕帜。
依次類推0,1,2,3...
下面開始變形:
df.unstack(level=0)
此時不是默認(rèn)的最里面的屬性一欄的旋轉(zhuǎn),而是我們指定的level=0的姓名一欄的順時針旋轉(zhuǎn)时甚,旋轉(zhuǎn)的位置依舊是columns的最里層
注:旋轉(zhuǎn)的對象可以指定撞秋,但是旋轉(zhuǎn)后的位置只能是最里層
同理:df.unstack(level=0).stack(level=0)
理解完這些變化后吻贿,再復(fù)雜的多重索引列表都可以輕松‘翻轉(zhuǎn)’到你想到的格式啦舅列。