這節的主題是 stack 和 unstack, 我目前還不知道專業領域是怎么翻譯的, 我自己理解的意思就是"組成堆"和"解除堆". 其實, 也是對數據格式的一種轉變方式, 單從字面上可能比較難理解, 所以給大家下面兩張圖來理解一下:


上圖中, 標綠色的部分, 代表一個對應關系, 就是列的級別轉為行級別.
下面來看下具體實現. 首先引入文件, 通過原表, 我們可以看到有兩行表頭, 所以這里要多加個參數 header=[0,1]:
df = pd.read_excel('/Users/rachel/Sites/pandas/py/pandas/12_stack/stocks.xlsx', header=[0,1])
輸出:
用 stack() 方法改變一下格式, 看會是什么效果:
df_stacked = df.stack() df_stacked
從輸出可以看到, 原來的數據結構是有兩行表頭, 經過 stack 之后, 就變成一行了, 也就是 Facebook Google Microsoft 這一行, 從原來的列名, 變成了索引:
那我們現在再 unstack 看看:
df_stacked.unstack()
輸出:

發現, unstack 之后, 整個數據結構又變回去了.
那我們現在再來重新 stack 一下, 並且加個參數 level=0, 也就是將第一行的表頭堆疊成索引列:
df.stack(level=0)
輸出:
下面再來看一個更復雜點的例子, 這個表格中有三行表頭:
df2 = pd.read_excel('/Users/rachel/Sites/pandas/py/pandas/12_stack/stocks_3_levels.xlsx', header=[0,1,2])
輸出:

首先 stack 一下:
df2.stack()
輸出, 我們看到最下面一行表頭被堆疊到索引列了:
再試一下將 level 參數設為 0:
df2.stack(level=0)
發現, 第一行表頭被 stack 了:
再設置 level=1:
df2.stack(level=1)
輸出, 這次是第二行表頭被 stack 了:
再試下設置 level=2:
df2.stack(level=2)
輸出, 發現是第三行表頭被 stack 了:
綜上, 可以總結, stack 的作用就是可以將橫向的表頭(列名)轉成縱向的索引列展示, 對於多行表頭而言, 具體要轉換哪一行取決於 level 參數, 如果不指定, 則默認轉換最下面一行表頭.
以上, 就是關於 stack 和 unstack 的基本操作了, enjoy!~~~
