alltools.one
Data
2025-07-01
8 min
alltools.one Team
CSVData CleaningData AnalysisETLPython

分析師與開發者的 CSV 資料清理技巧

CSV 檔案是表格式資料的通用交換格式。它們簡單、人類可讀,且從 Excel 到 pandas 的每個工具都支援。但現實世界中的 CSV 檔案往往很混亂 — 不一致的編碼、遺漏值、混合的資料型別和格式錯誤的列。本指南涵蓋可靠清理 CSV 資料的實用技巧。

常見的 CSV 問題

1. 編碼問題

最令人抓狂的 CSV 問題就是編碼。在 Windows 上用 Excel 建立的檔案可能使用 windows-1252,而你的 Python 腳本預期的是 utf-8

症狀:亂碼(mojibake),例如 é 而非 é,或 UnicodeDecodeError 異常。

偵測

import chardet

with open('data.csv', 'rb') as f:
    result = chardet.detect(f.read(10000))
    print(result)  # {'encoding': 'Windows-1252', 'confidence': 0.73}

修正:使用偵測到的編碼讀取,然後儲存為 UTF-8:

import pandas as pd

df = pd.read_csv('data.csv', encoding='windows-1252')
df.to_csv('data_clean.csv', encoding='utf-8', index=False)

2. 不一致的分隔符號

並非所有「CSV」都使用逗號。歐洲的 CSV 檔案常使用分號,因為在許多歐洲語系中逗號是小數分隔符號。

# 自動偵測分隔符號
import csv

with open('data.csv', 'r') as f:
    dialect = csv.Sniffer().sniff(f.read(5000))
    print(f"Delimiter: {repr(dialect.delimiter)}")

我們的 CSV 編輯器會自動偵測分隔符號 — 貼上你的資料,它就會識別格式。

3. 遺漏值

遺漏的資料可能以多種形式出現:空白儲存格、NAN/Anull-,或只是空白。

# 標準化所有遺漏值的表示方式
df = pd.read_csv('data.csv', na_values=['NA', 'N/A', 'null', '-', '', ' '])

# 檢查每一欄的遺漏值
print(df.isnull().sum())

# 策略一:刪除關鍵欄位有遺漏的列
df = df.dropna(subset=['email', 'name'])

# 策略二:用預設值填充
df['country'] = df['country'].fillna('Unknown')

# 策略三:向前填充(時間序列)
df['price'] = df['price'].ffill()

4. 重複的列

完全重複的列很容易找到。模糊重複(同一個人名字拼寫略有不同)則比較困難。

# 找出完全重複的列
duplicates = df[df.duplicated(keep=False)]
print(f"Found {len(duplicates)} duplicate rows")

# 移除重複,保留第一筆
df = df.drop_duplicates()

# 根據特定欄位移除重複
df = df.drop_duplicates(subset=['email'], keep='last')

5. 不一致的資料格式

日期格式混用、電話號碼有無國碼不一致、大小寫不統一:

# 標準化日期
df['date'] = pd.to_datetime(df['date'], format='mixed', dayfirst=False)

# 標準化文字欄位
df['name'] = df['name'].str.strip().str.title()
df['email'] = df['email'].str.strip().str.lower()

# 標準化電話號碼(基本處理)
df['phone'] = df['phone'].str.replace(r'[^0-9+]', '', regex=True)

6. 資料型別問題

CSV 將所有內容儲存為文字。含有前導零的數字、郵遞區號和電話號碼在解析時可能會失去格式:

# 保留郵遞區號中的前導零
df = pd.read_csv('data.csv', dtype={'zip_code': str, 'phone': str})

# 將貨幣字串轉換為數字
df['price'] = df['price'].str.replace('$', '').str.replace(',', '').astype(float)

清理後的驗證

務必驗證你清理過的資料:

# 檢查列數(是否意外增減了列?)
print(f"Rows: {len(df)}")

# 檢查資料型別
print(df.dtypes)

# 檢查數值範圍
print(df.describe())

# 檢查剩餘的空值
print(df.isnull().sum())

# 驗證唯一性約束
assert df['email'].is_unique, "Duplicate emails found!"

命令列工具

不用寫程式碼就能快速清理:

# 轉換編碼
iconv -f WINDOWS-1252 -t UTF-8 input.csv > output.csv

# 排序並移除重複列
sort -u input.csv > output.csv

# 擷取特定欄位(cut)
cut -d',' -f1,3,5 input.csv > output.csv

# 篩選列(awk)
awk -F',' '$3 > 100' input.csv > filtered.csv

若需更複雜的轉換,csvkit 等工具提供了完整的 CSV 工具套件:

# 安裝
pip install csvkit

# 查看欄位名稱
csvcut -n data.csv

# 篩選列
csvgrep -c country -m "USA" data.csv > usa_only.csv

# 轉換為 JSON
csvjson data.csv > data.json

需要在 CSV 和 JSON 之間轉換?我們的 CSV 轉 JSON 轉換器能即時完成。

常見問題

CSV 處理的最大檔案大小是多少?

CSV 格式本身沒有固有限制。實際限制取決於你的工具:Excel 可處理約 100 萬列,pandas 在足夠記憶體下可處理數 GB,而 Dask 或 Polars 等工具可處理超過記憶體大小的資料集。對於瀏覽器工具,我們的 CSV 編輯器可處理最大 100MB 的檔案。

資料交換應該使用 CSV 還是 JSON?

CSV 最適合扁平的表格式資料(試算表、資料庫匯出、簡單列表)。JSON 更適合巢狀的階層式資料(API 回應、配置、結構不固定的文件)。如需詳細比較,請參閱我們的 CSV vs JSON vs XML 指南。

相關資源

Published on 2025-07-01
CSV Data Cleaning Tips for Analysts and Developers | alltools.one