下面我們通過一個(gè)簡單例子來梳理數(shù)據(jù)清理步驟,也可以直接打開我的項(xiàng)目查看源代碼;
1.收集數(shù)據(jù)
首頁我們要加載項(xiàng)目里的數(shù)據(jù)集,代碼如下:
import pandas as pd
df = pd.read_csv('animals.csv')
2.評估數(shù)據(jù)
在這一步我們需要查看數(shù)據(jù)集數(shù)據(jù)來評估數(shù)據(jù)集,評估數(shù)據(jù)集可通過多種方法結(jié)合評估數(shù)據(jù),通常有head()、info()、describe()、value_counts()、sum()、duplicated();當(dāng)然這只是簡單評估方法,在比較復(fù)雜的情景下,可能需要查詢數(shù)據(jù)某個(gè)字段的是否有缺失值,或者某些字段在某種情況才有異常值,需要單獨(dú)刷選出來檢查,或者是在某個(gè)時(shí)間段的數(shù)據(jù)有問題,不同情況不同分析評估。
本例子比較簡單,我們這里只需要用head()來評估數(shù)據(jù)就行,代碼如下:

從上圖我們可以看出數(shù)據(jù)集存在以下質(zhì)量問題,我們記錄下來:
質(zhì)量
- 每個(gè)動(dòng)物名稱前面的 bb
- 體重和腦重量中小數(shù)點(diǎn)使用 ! 而不是 .
3.清理數(shù)據(jù)
清理數(shù)據(jù)前,我要copy一份數(shù)據(jù)進(jìn)行清理
df_clean = df.copy()
在這里我們就要通過上個(gè)流程說的步驟來進(jìn)行清理數(shù)據(jù),如果有不清楚的可以會(huì)看我上個(gè)流程寫的內(nèi)容(清理流程一)
定義
- 使用字符串分割,刪除每個(gè)動(dòng)物名稱前面的 'bb'
- 在體重和腦重量兩列,將 ! 替換為 .
代碼
# 使用字符串分割,刪除每個(gè)動(dòng)物名稱前面的 'bb'
df_clean['Animal'] = df_clean['Animal'].str[2:]
# 在體重和腦重量兩列,將 ! 替換為 .
df_clean['Body weight (kg)'] = df_clean['Body weight (kg)'].str.replace('!', '.')
df_clean['Brain weight (g)'] = df_clean['Brain weight (g)'].str.replace('!', '.')
測試
重新使用head() 查看數(shù)據(jù)集是否清理好
df_clean.Animal.head()

注意:代碼在這里我們數(shù)據(jù)清理步驟已完成,在這里大家也可以把清理步驟使用多個(gè)定義、代碼 和 測試 標(biāo)題來進(jìn)行清理,為什么呢?因?yàn)椋覀償?shù)據(jù)往往不止質(zhì)量問題,也有可能有整潔度問題,實(shí)際上,你可以立即進(jìn)行定義、編碼和測試。如果你需要清理許多質(zhì)量和整潔度問題呢?使用多個(gè)定義、代碼 和 測試 標(biāo)題這種順序來清理一個(gè)一個(gè)的問題,這樣結(jié)構(gòu)就比較清晰,也不容易忽略某個(gè)問題。
下面我們重新清理,上面評估出的問題有2個(gè),下面我們使用2個(gè)定義、代碼 和 測試來進(jìn)行清理數(shù)據(jù),
清理2
- 每個(gè)動(dòng)物名稱前面的 bb
定義
使用字符串分割,刪除每個(gè)動(dòng)物名稱前面的 'bb' 。
代碼
df_clean['Animal'] = df_clean['Animal'].str[2:]
測試
df_clean.Animal.head()
- 體重和腦重量中小數(shù)點(diǎn)使用 ! 而不是 .
定義
在體重和腦重量兩列,將 ! 替換為 .
代碼
df_clean['Body weight (kg)'] = df_clean['Body weight (kg)'].str.replace('!', '.')
df_clean['Brain weight (g)'] = df_clean['Brain weight (g)'].str.replace('!', '.')
測試
df_clean.Animal.head()