這節的主題是 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 引數, 如果不指定, 則預設轉換最下面一行表頭.
本作品採用《CC 協議》,轉載必須註明作者和本文連結