Pandas 好好用系列|帶你快速玩轉 melt() 功能
每次要進行巢狀表格的選取時,總不免需要多次選定欄位,但如果能一次就完整拆解表格豈不美哉?
此時,就是 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')]
>>> dfA 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),最多可以按五個喔!也歡迎你分享給你覺得有需要的朋友們。