Pandas 基礎 (12) - Stack 和 Unstack

Rachel發表於2019-04-14

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

Pandas 基礎(12) - Stack 和 Unstack

Pandas 基礎(12) - Stack 和 Unstack

上圖中, 標綠色的部分, 代表一個對應關係, 就是列的級別轉為行級別.
下面來看下具體實現. 首先引入檔案, 透過原表, 我們可以看到有兩行表頭, 所以這裡要多加個引數 header=[0,1]:

df = pd.read_excel('/Users/rachel/Sites/pandas/py/pandas/12_stack/stocks.xlsx', header=[0,1])

輸出:

Pandas 基礎(12) - Stack 和 Unstack

用 stack() 方法改變一下格式, 看會是什麼效果:

df_stacked = df.stack()
df_stacked

從輸出可以看到, 原來的資料結構是有兩行表頭, 經過 stack 之後, 就變成一行了, 也就是 Facebook Google Microsoft 這一行, 從原來的列名, 變成了索引:

Pandas 基礎(12) - Stack 和 Unstack

那我們現在再 unstack 看看:

df_stacked.unstack()

輸出:

Pandas 基礎(12) - Stack 和 Unstack

發現, unstack 之後, 整個資料結構又變回去了.

那我們現在再來重新 stack 一下, 並且加個引數 level=0, 也就是將第一行的表頭堆疊成索引列:

df.stack(level=0)

輸出:

Pandas 基礎(12) - Stack 和 Unstack

下面再來看一個更復雜點的例子, 這個表格中有三行表頭:

df2 = pd.read_excel('/Users/rachel/Sites/pandas/py/pandas/12_stack/stocks_3_levels.xlsx', header=[0,1,2])

輸出:

Pandas 基礎(12) - Stack 和 Unstack

首先 stack 一下:

df2.stack()

輸出, 我們看到最下面一行表頭被堆疊到索引列了:

Pandas 基礎(12) - Stack 和 Unstack

再試一下將 level 引數設為 0:

df2.stack(level=0)

發現, 第一行表頭被 stack 了:

Pandas 基礎(12) - Stack 和 Unstack

再設定 level=1:

df2.stack(level=1)

輸出, 這次是第二行表頭被 stack 了:

Pandas 基礎(12) - Stack 和 Unstack

再試下設定 level=2:

df2.stack(level=2)

輸出, 發現是第三行表頭被 stack 了:

Pandas 基礎(12) - Stack 和 Unstack

綜上, 可以總結, stack 的作用就是可以將橫向的表頭(列名)轉成縱向的索引列展示, 對於多行表頭而言, 具體要轉換哪一行取決於 level 引數, 如果不指定, 則預設轉換最下面一行表頭.

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章