2023年4月29日 星期六

試算表的 unpivoting/melting

有些試算表它的許多欄位恰好構成資料空間的某種分割, 例如12個月份、 各類交通工具、 4種血型、 全國22個縣市... 等等。 有時候我們會希望把這 N 個欄位合併成兩個欄位, 一個欄位紀錄原表格中的欄位名稱, 另一個欄位紀錄原表格的內容, 從而產生一個 「比較瘦、 N倍高」 的新表格。 這個轉換動作稱為 unpivotingmelting 這篇文章 的圖很清楚, 大推! 也可以參考 用 google 試算表做 unpivoting 的中文教學。

「電力能源來源分類」 也屬於這種表格。 為了繪製 treemap, 我們要先對它進行 unpivoting/melting。 找不到命令列工具可以直接套用; 不過 pandas 裡面就有 melt() 函數可以做這件事。 處理所以寫一個很短的程式 melt.py 就解決了。 呼叫 melt() 的時候, 必須指定哪些欄位不參與 melting。 原來的表格 electricity-mix-leaves.csv 有 14 欄、 7016 列, 轉換時有 10 欄參與 melting、 4 欄不參與, 最後產生的表格 electricity-mix-melted.csv 有 4+2 欄、 7016*10 列。

電力能源來源分類 如果是全國 七千八百多個村里 的某統計試算表, 想要把它變成 hierarchical 格式, 當然就要加上 「縣市」 與 「鄉鎮市區」 兩欄。 同理, 我們的 electricity-mix-melted.csv 也要把右圖中的 internal nodes 加上去。 為了簡化, 我省略最上層, 只做 generation 以下, 又取消 renewable 那一層, 直接把所有 renewable 都拉上來 low_carbon 這一層, 最後總共只有三層 (9 個 leaves、 中間層兩個 nodes、 最上層的 root 是 "generation")。 可以這樣處理: grep -v ',imports,' electricity-mix-melted.csv | perl -pe 's/,(nuclear|hydro|solar|wind|bio|other),/,low_carbon,$1,/ ; s/,(coal|oil|gas),/,fossil,$1,/' > electricity-mix-hierarchy.csv 最後再手動在第一列的 "Year" 跟 "source" 之間加上一個 "type" 的新欄位名稱, 就可以了。

沒有留言:

張貼留言

因為垃圾留言太多,現在改為審核後才發佈,請耐心等候一兩天。