目錄
數據挖掘過程中,採集的原始數據裏存在着各種不利於分析與建模工作的因素,比如數據不完整、數據矛盾、異常值等。這些因素不僅影響建模的執行過程,更有甚者在不知不覺間給出錯誤的建模結果,這就使得數據清洗顯得尤爲重要。但是數據清洗並不是數據預處理的全部內容,它只是第一步而已,接下來還有數據集成、數據轉換和數據規約等一系列處理。在實際應用中,數據預處理的工作量佔整個建模過程的60%,可以說,預處理做得好,模型基本就出來了。
數據預處理的主要內容包括:
- 數據清洗;
- 數據集成;
- 數據轉換;
- 數據規約;
但是在這一篇裏,我們只講數據清洗,其他部分會慢慢整理。
數據清洗
數據清洗主要是刪除原始數據中的無關數據,重複數據,平滑噪聲數據,篩選掉與建模目的無關的數據,處理缺失值與異常值等。
缺失值處理
處理缺失值的方法分爲3類:刪除、插補、不處理。
刪除缺失值
如果通過刪除小部分的數據就可以達到目標,那麼這無疑是最簡單高效的辦法。但是考慮到數據採集的不易,因此一般不會輕易刪除數據。
先來看看數據的大致情況
import pandas as pd
#讀取文件
datafile = u'E:\\pythondata\\tt.xlsx'#文件所在位置
data = pd.read_excel(datafile)#如果是csv文件則用read_csv
print("顯示缺失值,缺失則顯示爲TRUE:\n", data.isnull())#是缺失值返回True,否則範圍False
print("---------------------------------\n顯示每一列中有多少個缺失值:\n",data.isnull().sum())#返回每列包含的缺失值的個數
運行結果:
顯示缺失值,缺失則顯示爲TRUE: 姓名 身高 性別 血型 出生年份 籍貫 0 False False False False False False 1 False False False False False True 2 True True True True True True 3 False False False False False False 4 False False False False False False 5 False False False False False False 6 False True True False True True 7 False False False False False False --------------------------------- 顯示每一列中有多少個缺失值: 姓名 1 身高 2 性別 2 血型 1 出生年份 2 籍貫 3 dtype: int64
刪除缺失值具體的情況是一下幾種:
data.dropna()
#直接刪除含有缺失值的行data.dropna(axis = 1)
#直接刪除含有缺失值的列data.dropna(how = 'all')
#只刪除全是缺失值的行data.dropna(thresh = 3)
#保留至少有3個非空值的行data.dropna(subset = [u'
血型'])
#判斷特定的列,若該列含有缺失值則刪除缺失值所在的行
插補缺失值
常見的插補方法:
看一眼源數據:
import pandas as pd
#讀取文件
datafile = u'E:\\pythondata\\ttt.xlsx'#文件所在位置
data = pd.read_excel(datafile)#如果是csv文件則用read_csv
print("顯示源數據data:\n", data)#是缺失值返回True,否則範圍False
print("------------------\n用均值插補後的數據data:\n", data.fillna(data.mean()))
運行結果:
顯示源數據data: 姓名 工資 0 張三 11687.0 1 李四 10237.0 2 王五 8971.0 3 趙六 9310.0 4 馬七 15890.0 5 楊八 NaN 6 譚九 12361.0 7 黃十 9219.0 ------------------ 用均值插補後的數據data: 姓名 工資 0 張三 11687.000000 1 李四 10237.000000 2 王五 8971.000000 3 趙六 9310.000000 4 馬七 15890.000000 5 楊八 11096.428571 6 譚九 12361.000000 7 黃十 9219.000000
簡單的缺失值插補方法:
data.fillna(data.mean())
#均值插補data.fillna(data.median())
#中位數插補data.fillna(data.mode())
#衆數插補data.fillna(data.max())
#最大值插補data.fillna(data.min())
#最小值插補data.fillna(0)
#固定值插補--用0填充data.fillna(5000)
#固定值插補--用已知的行業基本工資填充data
.fillna(method='ffill')
#最近鄰插補--用缺失值的前一個值填充data
.fillna(method='pad')
#最近鄰插補--用缺失值的前一個值填充
通過擬合函數來插補的方法:
主要說一說拉格朗日插值法吧,除了拉格朗日插值法,還有牛頓插值法、Hermite插值法、分段插值法和樣條插值法。有興趣的可以把後幾種方法的代碼也研究出來。
下面是拉格朗日插值法的博客鏈接,因爲寫的很細,所以就不重複了,點擊鏈接跳轉去看一看吧。
不處理缺失值
不處理就是不管,所以此處省略一萬字......
重複值處理
在Pandas中,.duplicated()表示找出重複的行,默認是判斷全部列,返回布爾類型的結果。對於完全沒有重複的行,返回 False,對於有重複的行,第一次出現的那一行返回 False,其餘的返回 True。
與.duplicated()對應的,.drop_duplicates()表示去重,即刪除布爾類型爲 True的所有行,默認是判斷全部列。
import pandas as pd
import numpy as np
from pandas import DataFrame,Series
#讀取文件
datafile = u'E:\\pythondata\\tt.xlsx'#文件所在位置,u爲防止路徑中有中文名稱,此處沒有,可以省略
data = pd.read_excel(datafile)#datafile是excel文件,所以用read_excel,如果是csv文件則用read_csv
examDf = DataFrame(data)
#去重
print(examDf.duplicated())#判斷是否有重複行,重複的顯示爲TRUE,
examDf.drop_duplicates()#去掉重複行
#指定某列判斷是否有重複值
print(examDf.duplicated('name'))#判斷name列是否有重複行,重複的顯示爲TRUE,
examDf.drop_duplicates('name')#去掉重複行
#根據多列判斷是否有重複值
print(examDf.duplicated(['name','sex','birthday']))#判斷name,sex,birthday列是否有重複行,重複的顯示爲TRUE,
examDf.drop_duplicates(['name','sex','birthday'])#去掉重複行
此處只是放出代碼來,若想要了解更多,比如數據源和代碼運行結果比較,可點擊下面鏈接查看:
異常值處理
數據清洗過程中的異常值的處理,是選擇剔除還是用其他值代替,需要視情況而定。有些異常值可能包含某些信息,需認真思考後採取處理方法。
常見的異常值處理辦法:
刪除異常值
import pandas as pd #導入pandas庫
inputfile = u'E:\\pythondata\\ttt.xlsx'
data= pd.read_excel(inputfile)
#將工資低於1000或者高於10萬的異常值清空
data[u'工資'][(data[u'工資']<1000) | (data[u'工資']>100000)] = None
#清空後刪除
print(data.dropna())
視爲缺失值後進行插補
#將工資低於1000或者高於10萬的異常值清空
data[u'工資'][(data[u'工資']<1000) | (data[u'工資']>100000)] = None
#清空後用均值插補
print(data.fillna(data.mean()))
除了用均值插補之外還可以用中位數、衆數、最值、固定值、最近鄰值、拉格朗日等插值,具體方法往前翻,上面剛寫完。
OVER!