iT邦幫忙

2026 iThome 鐵人賽

DAY 4
0
自我挑戰組

Medical Data Cleaner系列 第 13 篇

處理缺失值與建立清理後資料

  • 分享至 

  • xImage
  •  

前幾天完成資料品質檢查後,系統已經可以找出資料中的缺失值、格式錯誤、數值異常、重複資料以及一致性問題。
不過目前的功能主要都是「找出問題」,如果真的要做成一個資料清理工具,還需要進一步處理這些問題。
所以今天先從最基本的缺失值開始,讓系統在發現空白資料後,不只是顯示問題,也可以建立一份清理後的資料。
一、先找出缺失值
目前測試資料中P002的gender是空白的
在原本缺失職檢查程式執行後會看到:

【缺失值】P002 → gender → 建議處理:補上資料或標記為 Unknown

這樣就可以知道是哪一位病人的哪一個欄位缺少資料。
二、建立清理後資料
如果直接修改原本的$row,之後可能會不容易比較原始資料和清理後資料,因此另外建立$cleanedRows,用來存放清理後的資料。

$cleanedRows = [];

讀取每一筆資料時再建立一個$cleanedRow:

while (($row = fgetcsv($handle, 0, ',', '"', '')) !== false) {
$cleanedRow = $row; 
$totalRows++;

這樣$row可以保留原始資料,而$cleanedRow則可以用來進行清理。
三、處理缺失的gender
這次的測試資料中,缺失的是gender,因此先針對這個欄位進行處理。
如果發現欄位是空白,就把清理後的資料設定為Unknown:

if ($header[$index] === 'gender') {
    $cleanedRow[$index] = 'Unknown';
}

完整的缺失值處理變成:

foreach ($row as $index => $value) {

    if (trim($value) === '') {

        $missingCount++;
        $affectedPatients[$row[0]] = true;

        echo '【缺失值】' . $row[0] . ' → '
            . $header[$index]
            . ' → 建議處理:補上資料或標記為 Unknown<br>';

        if ($header[$index] === 'gender') {
            $cleanedRow[$index] = 'Unknown';
        }
    }
}

這裡沒有直接修改原本的 CSV,而是修改 $cleanedRow。
這樣可以保留原始資料,也方便之後進行「清理前」和「清理後」的比較。
四、儲存每一筆清理後的資料
完成一筆資料的檢查與處理後,把清理後的資料加入$cleanedRows:

$cleanedRows[] = $cleanedRow;

因此最後$cleanedRows裡面就會存放整份清理後的資料。
五、顯示清理後資料
接著在讀取完CSV後,加入清理後資料的預覽:

echo '<hr>';
echo '<h3>清理後資料預覽</h3>';
echo '<table border="1" cellpadding="5">';
echo '<tr>';
foreach ($header as $column) {
    echo '<th>' . $column . '</th>';
}
echo '</tr>';
foreach ($cleanedRows as $cleanedRow) {
    echo '<tr>';
    foreach ($cleanedRow as $value) {
        echo '<td>' . $value . '</td>';
    }
    echo '</tr>';
}
echo '</table>';

這樣網頁上除了原本的資料品質檢查結果之外,下面還會多出一個「清理後資料預覽」。
六、執行結果
原本 P002 的資料是:

P002 | 25 | [空白] | 165 | 52 | 115/75 | 82 | 外科 | 2026-09-01

清理後的資料則變成:

P002 | 25 | Unknown | 165 | 52 | 115/75 | 82 | 外科 | 2026-09-01

其他沒有缺失值的資料則維持原本的內容。


上一篇
整合醫療資料品質檢查功能
下一篇
資料格式標準化
系列文
Medical Data Cleaner 共 16 篇
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言