Pandas 好好用系列|帶你快速玩轉 melt() 功能

學.誌|Chris Kang
不止數據|Not Only Data
4 min readNov 8, 2019

--

每次要進行巢狀表格的選取時,總不免需要多次選定欄位,但如果能一次就完整拆解表格豈不美哉?

此時,就是 melt 大展身手的時機。當我們需要多層級分拆資料時,透過 melt 功能就能省去繁雜的操作,以一條函式達到目的,是不是完全展現 Python 精簡的精神xD

參數與函式說明:

pandas.melt(frame, id_vars=None, value_vars=None, var_name=None, value_name='value', col_level=None)
  • frame : 你想要更動的 DataFrame。
  • id_vars: 可使用 tuple、list、或 ndarray,用以設定不想要被轉換的欄位。
  • value_vars: 可使用 tuple、list、或 ndarray,用以設定想要被拆解的欄位。 如果省略則拆解全部欄位。
  • var_name : 轉換後 id 的名稱。如果省略則設定為原本 DataFrame 的欄位名稱或是 variable
  • value_name : 轉換後 value 欄位的名稱。如果省略則顯示原本 DataFrame 的欄位名稱value
  • col_level : 可使用 int、string。如果 columns 是 MultiIndex,則使用該參數來進行選擇。

實際案例:

# 設定 DataFrame>>> import pandas as pd
>>> df = pd.DataFrame({'A': {0: 'a', 1: 'b', 2: 'c'},
... 'B': {0: 1, 1: 3, 2: 5},
... 'C': {0: 2, 1: 4, 2: 6}})
>>> df
A B C
0 a 1 2
1 b 3 4
2 c 5 6

一、以 id_var 與 value_var 進行資料操作

格式轉換:固定 B 欄,並拆解 A 欄

概念說明:透過固定 B 欄來保持該欄數值不變,並把 A 欄拆成變數(variable),此處能想像成固定 A(欄)後,會跑出代表 A 欄下,分別輸入 B 欄後輸出的數值。

>>> pd.melt(df, id_var(['B'], value_var(['A']))   B variable  value
0 1 A a
1 3 A b
2 5 A c

二、以 id_var 與 value_var 加上欄位名稱

格式轉換:固定 B 欄,並拆解 A 欄

概念說明:概念同上,但個別替換掉上述的 variable 與 value 的欄位名。

>>> pd.melt(df, id_var(['B'], value_var(['A']), var_name='varName', value_name='valName')   B  varName  valName
0 1 A a
1 3 A b
2 5 A c

三、如果欄位為 Muiltindex,且選擇其中特定欄位

格式轉換:從複數欄中選擇第一欄(col_level=0),並固定 B 欄拆解 A 欄

概念說明:利用參數 col_level 來選擇欄位的層級,再固定 B 欄位後拆解 A 欄位,會得到與上述相同的結果。

>>> df.columns = [list('ABC'), list('DEF')]
>>> df
A B C
D E F

0 a 1 2
1 b 3 4
2 c 5 6
>>> pd.melt(df, id_vars=['B'], value_vars=['A'], col_level=0) B variable value
0 1 A a
1 3 A b
2 5 A c

四、如果欄位為 Muiltindex,且同時選擇兩層欄位

格式轉換:透過 tuple 選擇兩層欄位,並固定 B, E 欄拆解 A, D 欄

概念說明:直接以 tuple 選擇 B, E 兩層欄位,後拆解 A, D 兩個欄位,會個別顯示拆解後的欄位,因此不需要再輸入 col_level 來選擇特定欄位。

>>> df.columns = [list('ABC'), list('DEF')]
>>> df
A B C
D E F

0 a 1 2
1 b 3 4
2 c 5 6
>>> pd.melt(df, id_vars=[('B', 'E')], value_vars=[('A', 'D')) (B, E) variable_0 variable_1 value
0 1 A D a
1 3 A D b
2 5 A D c

謝謝你/妳,願意把我的文章閱讀完

如果你喜歡筆者在 Medium 的文章,可以拍個手(Claps),最多可以按五個喔!也歡迎你分享給你覺得有需要的朋友們。

參考資料:

--

--

學.誌|Chris Kang
不止數據|Not Only Data

嗨!我是 Chris,一位擁有技術背景的獵頭,熱愛解決生活與職涯上的挑戰。專注於產品管理/資料科學/前端開發 / 人生成長,在這條路上,歡迎你找我一起聊聊。歡迎來信合作和交流: chriskang0917@gmail.com