在做數據分析的時候,數據集的結構往往是便於人類閱讀而不是利於機器去做分析,而在之前的文章中也曾詳細敘述過怎樣的數據集結構是好的,這篇文章就來說明怎麼使用 pandas 來整理數據集的結構。
拆分與合併 column #
將一個字串 column「橫向」拆分為多個 column #
如果想要拆分某個 column,例如某個column的數據是 “身高/體重”,我們可以使用:
df["身高/體重"].str.split("/")
.split()
可以讓我們根據指定的符號(例如 /
)把字串拆成 list;預設情況下,每個元素會變成一個 list 裡的元素,但如果加上 expand=True
,會直接展平成新的 dataframe 欄位:
df["身高/體重"].str.split("/", expand = True)
最後,我們把拆分後的column加入原本的 dataframe 中:
df[["身高", "體重"]] = df["身高/體重"].str.split("/", expand = True)
記住,這樣只是產出了兩個新的 column,原本的 身高/體重
的 column 還是存在,所以我們需要用 drop 方法刪除:
df.drop("身高/體重", axis = 1, inplace = True)
將一個內容為 list 的 column「縱向」拆分成多個 row #
假如有某個 column 為 list,例如:
姓名 興趣
0 小明 [籃球, 足球, 游泳]
1 小華 [音樂, 繪畫]
我們想要把它拆分開來,我們可以使用:
df_exploded = df.explode("興趣")
就能得到拆分了興趣的新表。
合併 column #
想要合併兩個column的話也很簡單,舉個例子,我們有一個column叫“姓”,另外一個叫做“名”,如果我們想把它合併為“姓名”,我們可以:
df["姓"].str.cat(df["名"], sep = " ")
其中sep
的意思是姓
和名
之間的填充字符。當然不要忘記賦值到原本的 dataframe 上,因為這個函數不會直接修改原本的dataframe:
df["姓名"] = df["姓"].str.cat(df["名"], sep = " ")
然後就可以把原本的那兩個 column 給 drop 掉了。
把“寬”數據轉換為“長”數據 #
這裡需要舉個例子比較好說明,例子:
這是一個“寬”的數據,記錄了病人不同醫療檢測的檢測值,由於實際上每個病人檢查的項目不同,所以如果以每個檢查項目都為一個 column,那很有可能會有大量的 NaN
. 為了避免發生這樣的事情,我們就有必要把它轉為長數據。
病人編號 | 血壓 | 血糖 | 心率 |
---|---|---|---|
001 | 120 | 90 | 80 |
002 | 130 | NaN | 85 |
我們可以使用 Pandas 的 melt()
方法,將資料轉換為更適合管理和分析的「長格式」:
df_long = pd.melt(df, id_vars=["病人編號"], var_name="測量指標", value_name="數值")
就能得到:
病人編號 測量指標 數值
0 001 血壓 120.0
1 002 血壓 130.0
2 001 血糖 90.0
3 002 血糖 NaN
4 001 心率 80.0
5 002 心率 85.0
其中每個參數的意思是:
參數 | 作用 |
---|---|
id_vars=["病人編號"] |
指定哪個欄位是每筆資料的固定識別欄位(不變的欄位) |
var_name="測量指標" |
指定新的欄位名稱,用來存放原本的欄位名稱(例如:血壓、血糖、心率) |
value_name="數值" |
指定新的欄位名稱,用來存放對應的數值 |