Python數據預處理 - 數據清洗 - 洗什麼?怎麼洗?看完就明白了

目錄

數據清洗

缺失值處理

刪除缺失值

插補缺失值

不處理缺失值

重複值處理

異常值處理

刪除異常值

視爲缺失值後進行插補


數據挖掘過程中,採集的原始數據裏存在着各種不利於分析與建模工作的因素,比如數據不完整、數據矛盾、異常值等。這些因素不僅影響建模的執行過程,更有甚者在不知不覺間給出錯誤的建模結果,這就使得數據清洗顯得尤爲重要。但是數據清洗並不是數據預處理的全部內容,它只是第一步而已,接下來還有數據集成、數據轉換和數據規約等一系列處理。在實際應用中,數據預處理的工作量佔整個建模過程的60%,可以說,預處理做得好,模型基本就出來了。

數據預處理的主要內容包括:

  1. 數據清洗;
  2. 數據集成;
  3. 數據轉換;
  4. 數據規約;

但是在這一篇裏,我們只講數據清洗,其他部分會慢慢整理。

 

數據清洗

數據清洗主要是刪除原始數據中的無關數據,重複數據,平滑噪聲數據,篩選掉與建模目的無關的數據,處理缺失值與異常值等。

 

缺失值處理

處理缺失值的方法分爲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'血型 ']) #判斷特定的列,若該列含有缺失值則刪除缺失值所在的行

dropna官網介紹文檔

 

插補缺失值

常見的插補方法:

看一眼源數據:

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'])#去掉重複行

此處只是放出代碼來,若想要了解更多,比如數據源和代碼運行結果比較,可點擊下面鏈接查看:

Python數據預處理 - 數據清洗 - 重複值處理

 

異常值處理

數據清洗過程中的異常值的處理,是選擇剔除還是用其他值代替,需要視情況而定。有些異常值可能包含某些信息,需認真思考後採取處理方法。

常見的異常值處理辦法:

刪除異常值

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!

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章