Kaggle 數據清洗挑戰 Day 4 - 字元編碼(Character Encoding)處理

Kaggle 數據清洗挑戰 Day 4 - 字元編碼(Character Encoding)處理

來自專欄 數據池塘

今天是 Kaggle 數據清洗挑戰的第四天,任務是對字元進行編碼處理~

分為四個部分來學習:

  1. Get our environment set up
  2. What are encodings?
  3. Reading in files with encoding problems
  4. Saving your files with UTF-8 encoding

1、搭建環境

首先還是引入需要的 lib 包:

# modules well useimport pandas as pdimport numpy as np# helpful character encoding moduleimport chardet# set seed for reproducibilitynp.random.seed(0)


2、什麼是編碼?

字元編碼(Character Encoding)是把字符集中的字元編碼為指定集合中某一對象(例如:比特模式、自然數序列、8位組或者電脈衝),以便文本在計算機中存儲和通過通信網路的傳遞。例如:將字元串 0110100001101001 編碼為人類能讀懂的文本 「hi」。

現階段存在很多不同的編碼規則,其中最重要的一個就是 UTF-8:

UTF-8(8-bit Unicode Transformation Format)是一種針對 Unicode 的可變長度字元編碼,又稱萬國碼。UTF-8 用 1 到 6 個位元組編碼 Unicode 字元。用在網頁上可以統一頁面顯示中文簡體繁體及其它語言(如英文,日文,韓文)。

先看一個例子,設定一段字元串,類型的輸出結果為 str:

# start with a stringbefore = "This is the euro symbol: €"# check to see what datatype it istype(before)

然後對這個字元串進行 UTF-8 編碼:

# encode it to a different encoding, replacing characters that raise errorsafter = before.encode("utf-8", errors = "replace")# check the typetype(after)

如果你查看一個 bytes 類型的對象,你會發現結果前邊有一個字母 b,後面跟著一串文本,這是因為這段文本被識別為了由 ASCII 編碼過的數據。我們也看到歐元符號被識別為了一些 「mojibake「,這是因為 ASCII 是一種比較老的編碼方式,有一些新的符號沒有被加入。

# take a look at what the bytes look likeafter

當我們用正確的方式來進行解碼時,也得到了正確的結果:

# convert it back to utf-8print(after.decode("utf-8"))

當我們使用不同的編碼方式來對 bytes 進行解碼時,就會輸出錯誤:

# try to decode our bytes with the ascii encodingprint(after.decode("ascii"))

當我們用其他編碼方式將 string 轉化為 bytes ,再進行解碼時,也會輸出錯誤,因為 python 3 默認的編碼方式是 UTF-8,如果我們使用 ASCII:

# start with a stringbefore = "This is the euro symbol: €"# encode it to a different encoding, replacing characters that raise errorsafter = before.encode("ascii", errors = "replace")# convert it back to utf-8print(after.decode("ascii"))# Weve lost the original underlying byte string! Its been # replaced with the underlying byte string for the unknown character :(


3、讀文件時可能遇到的編碼問題

我們平時遇到的大多數文件都是 UTF-8 編碼的,這也是 python 所期望的,但有時候遇到非 UTF-8 編碼的文件就會輸出錯誤:

解決錯誤的一個辦法就是去嘗試不同的編碼規則,看看哪一個可以正常工作。還有一個途徑是用 chardet 來獲取其編碼規則,但也不保證結果 100% 正確。

我們可以先查看文件的前 10000 個位元組,一般來說已經足夠來推測整個文件的編碼規則:

# look at the first ten thousand bytes to guess the character encodingwith open("../input/kickstarter-projects/ks-projects-201801.csv", rb) as rawdata: result = chardet.detect(rawdata.read(10000))# check what the character encoding might beprint(result)

從結果來看,chardet 有 73% 的自信確定該文件的編碼方式為 Windows-1252,下面來檢驗這個結果是否正確:

# read in the file with the encoding detected by chardetkickstarter_2016 = pd.read_csv("../input/kickstarter-projects/ks-projects-201612.csv", encoding=Windows-1252)# look at the first few lineskickstarter_2016.head()

沒有報錯,可以顯示該數據集的前5條記錄,說明 chardet 的結果是正確的!


4、使用 UTF-8 編碼方式來保存文件

UTF-8 是 python 的標準編碼方式,當我們保存一個文件時,將默認為使用 UTF-8:

# save our file (will be saved as UTF-8 by default!)kickstarter_2016.to_csv("ks-projects-201801-utf8.csv")

這就是 5 Day Challenge 第四天的內容,完畢~


推薦閱讀:

你問我答之「關於人工智慧客服YiBot的一切」
2017年歷史文章匯總|機器學習
利用R語言繪製世界航班路線圖
數據分析師值得交的5類朋友
「Python」用Cosine Similarity實現相關文章推薦

TAG:大數據 | 數據清洗 | 數據挖掘 |