Python数据清洗 - 洗什么?怎么洗?看完就明白了
目錄
缺失值處理
刪除缺失值
插補(bǔ)缺失值
不處理缺失值
重復(fù)值處理
異常值處理
遍歷查找異常值,并根據(jù)規(guī)則調(diào)整大小?
刪除異常值
視為缺失值后進(jìn)行插補(bǔ)
數(shù)據(jù)挖掘過(guò)程中,采集的原始數(shù)據(jù)里存在著各種不利于分析與建模工作的因素,比如數(shù)據(jù)不完整、數(shù)據(jù)矛盾、異常值等。這些因素不僅影響建模的執(zhí)行過(guò)程,更有甚者在不知不覺(jué)間給出錯(cuò)誤的建模結(jié)果,這就使得數(shù)據(jù)清洗顯得尤為重要。但是數(shù)據(jù)清洗并不是數(shù)據(jù)預(yù)處理的全部?jī)?nèi)容,它只是第一步而已,接下來(lái)還有數(shù)據(jù)集成、數(shù)據(jù)轉(zhuǎn)換和數(shù)據(jù)規(guī)約等一系列處理。在實(shí)際應(yīng)用中,數(shù)據(jù)預(yù)處理的工作量占整個(gè)建模過(guò)程的60%,可以說(shuō),預(yù)處理做得好,模型基本就出來(lái)了。
數(shù)據(jù)預(yù)處理的主要內(nèi)容包括:
但是在這一篇里,我們只講數(shù)據(jù)清洗,其他部分會(huì)慢慢整理。
數(shù)據(jù)清洗主要是刪除原始數(shù)據(jù)中的無(wú)關(guān)數(shù)據(jù),重復(fù)數(shù)據(jù),平滑噪聲數(shù)據(jù),篩選掉與建模目的無(wú)關(guān)的數(shù)據(jù),處理缺失值與異常值等。
缺失值處理
除了很明顯的缺失值(單元格處無(wú)值)之外,還有一種隱形的缺失值,比如,你要分析一個(gè)人從2018年初到現(xiàn)在每個(gè)月的收入情況,加入某個(gè)月這個(gè)人完全沒(méi)有收入,賬單流水中是不會(huì)顯示這種情況的,如果你想把對(duì)這些沒(méi)有收入的月份進(jìn)行缺失值處理的話,首先你就要找出哪些月份不在賬單流水中。那么請(qǐng)看下面這個(gè)鏈接中的文章吧,文章會(huì)給出2018年初到現(xiàn)在連續(xù)的日期,你只需要匹配一下就知道哪些月份不在賬單中了。
缺失值處理 - 獲取一段時(shí)間內(nèi)所有日期的列表 - (Python、MySQL)
處理缺失值的方法分為3類:刪除、插補(bǔ)、不處理。
刪除缺失值
如果通過(guò)刪除小部分的數(shù)據(jù)就可以達(dá)到目標(biāo),那么這無(wú)疑是最簡(jiǎn)單高效的辦法。但是考慮到數(shù)據(jù)采集的不易,因此一般不會(huì)輕易刪除數(shù)據(jù)。
先來(lái)看看數(shù)據(jù)的大致情況
import pandas as pd#讀取文件 datafile = u'E:\\pythondata\\tt.xlsx'#文件所在位置 data = pd.read_excel(datafile)#如果是csv文件則用read_csv print("顯示缺失值,缺失則顯示為T(mén)RUE:\n", data.isnull())#是缺失值返回True,否則范圍False print("---------------------------------\n顯示每一列中有多少個(gè)缺失值:\n",data.isnull().sum())#返回每列包含的缺失值的個(gè)數(shù)運(yùn)行結(jié)果:
顯示缺失值,缺失則顯示為T(mén)RUE:姓名 身高 性別 血型 出生年份 籍貫 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 --------------------------------- 顯示每一列中有多少個(gè)缺失值:姓名 1 身高 2 性別 2 血型 1 出生年份 2 籍貫 3 dtype: int64刪除缺失值具體的情況是一下幾種:
- data.dropna()?#直接刪除含有缺失值的行
- data.dropna(axis = 1)?#直接刪除含有缺失值的列
- data.dropna(how = 'all')?#只刪除全是缺失值的行
- data.dropna(thresh = 3)?#保留至少有3個(gè)非空值的行
- data.dropna(subset = [u'血型 '])?#判斷特定的列,若該列含有缺失值則刪除缺失值所在的行
dropna官網(wǎng)介紹文檔
插補(bǔ)缺失值
常見(jiàn)的插補(bǔ)方法:
看一眼源數(shù)據(jù):
import pandas as pd#讀取文件 datafile = u'E:\\pythondata\\ttt.xlsx'#文件所在位置 data = pd.read_excel(datafile)#如果是csv文件則用read_csv print("顯示源數(shù)據(jù)data:\n", data)#是缺失值返回True,否則范圍False print("------------------\n用均值插補(bǔ)后的數(shù)據(jù)data:\n", data.fillna(data.mean()))運(yùn)行結(jié)果:
顯示源數(shù)據(jù)data:姓名 工資 0 張三 11687.0 1 李四 10237.0 2 王五 8971.0 3 趙六 9310.0 4 馬七 15890.0 5 楊八 NaN 6 譚九 12361.0 7 黃十 9219.0 ------------------ 用均值插補(bǔ)后的數(shù)據(jù)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簡(jiǎn)單的缺失值插補(bǔ)方法:
- data.fillna(data.mean())??#均值插補(bǔ)
- data.fillna(data.median())?#中位數(shù)插補(bǔ)
- data.fillna(data.mode())??#眾數(shù)插補(bǔ)
- data.fillna(data.max())? ?#最大值插補(bǔ)
- data.fillna(data.min())? ?#最小值插補(bǔ)
- data.fillna(0)? ? ? ? ?#固定值插補(bǔ)--用0填充
- data.fillna(5000)? ? ? ?#固定值插補(bǔ)--用已知的行業(yè)基本工資填充
- data.fillna(method='ffill')#最近鄰插補(bǔ)--用缺失值的前一個(gè)值填充
- data.fillna(method='pad')?#最近鄰插補(bǔ)--用缺失值的前一個(gè)值填充
通過(guò)擬合函數(shù)來(lái)插補(bǔ)的方法:
主要說(shuō)一說(shuō)拉格朗日插值法吧,除了拉格朗日插值法,還有牛頓插值法、Hermite插值法、分段插值法和樣條插值法。有興趣的可以把后幾種方法的代碼也研究出來(lái)。
下面是拉格朗日插值法的博客鏈接,因?yàn)閷?xiě)的很細(xì),所以就不重復(fù)了,點(diǎn)擊鏈接跳轉(zhuǎn)去看一看吧。
文章鏈接:數(shù)據(jù)預(yù)處理 - 缺失值處理 - 拉格朗日插值法
或者,也可以使用缺失值所在行的上一行填補(bǔ)缺失值:
文章鏈接:缺失值處理 - 定位空值并用空值的上一個(gè)值填充 - (Excel)_Not Found黃小包-CSDN博客_excel填充空值
不處理缺失值
不處理就是不管,所以此處省略一萬(wàn)字......
重復(fù)值處理
在Pandas中,.duplicated()表示找出重復(fù)的行,默認(rèn)是判斷全部列,返回布爾類型的結(jié)果。對(duì)于完全沒(méi)有重復(fù)的行,返回 False,對(duì)于有重復(fù)的行,第一次出現(xiàn)的那一行返回 False,其余的返回 True。
與.duplicated()對(duì)應(yīng)的,.drop_duplicates()表示去重,即刪除布爾類型為 True的所有行,默認(rèn)是判斷全部列。
import pandas as pd import numpy as np from pandas import DataFrame,Series#讀取文件 datafile = u'E:\\pythondata\\tt.xlsx'#文件所在位置,u為防止路徑中有中文名稱,此處沒(méi)有,可以省略 data = pd.read_excel(datafile)#datafile是excel文件,所以用read_excel,如果是csv文件則用read_csv examDf = DataFrame(data)#去重 print(examDf.duplicated())#判斷是否有重復(fù)行,重復(fù)的顯示為T(mén)RUE, examDf.drop_duplicates()#去掉重復(fù)行#指定某列判斷是否有重復(fù)值 print(examDf.duplicated('name'))#判斷name列是否有重復(fù)行,重復(fù)的顯示為T(mén)RUE, examDf.drop_duplicates('name')#去掉重復(fù)行#根據(jù)多列判斷是否有重復(fù)值 print(examDf.duplicated(['name','sex','birthday']))#判斷name,sex,birthday列是否有重復(fù)行,重復(fù)的顯示為T(mén)RUE, examDf.drop_duplicates(['name','sex','birthday'])#去掉重復(fù)行此處只是放出代碼來(lái),若想要了解更多,比如數(shù)據(jù)源和代碼運(yùn)行結(jié)果比較,可點(diǎn)擊下面鏈接查看:
Python數(shù)據(jù)預(yù)處理 - 數(shù)據(jù)清洗 - 重復(fù)值處理
異常值處理
數(shù)據(jù)清洗過(guò)程中的異常值的處理,是選擇剔除還是用其他值代替,需要視情況而定。有些異常值可能包含某些信息,需認(rèn)真思考后采取處理方法。
常見(jiàn)的異常值處理辦法:
遍歷查找異常值,并根據(jù)規(guī)則調(diào)整大小?
文章鏈接:異常值處理 - iterrows()對(duì) DataFrame 進(jìn)行遍歷,并修改遍歷中的異常值 - Python代碼
刪除異常值
import pandas as pd #導(dǎo)入pandas庫(kù)inputfile = u'E:\\pythondata\\ttt.xlsx'data= pd.read_excel(inputfile)#將工資低于1000或者高于10萬(wàn)的異常值清空 data[u'工資'][(data[u'工資']<1000) | (data[u'工資']>100000)] = None #清空后刪除 print(data.dropna())視為缺失值后進(jìn)行插補(bǔ)
#將工資低于1000或者高于10萬(wàn)的異常值清空 data[u'工資'][(data[u'工資']<1000) | (data[u'工資']>100000)] = None #清空后用均值插補(bǔ) print(data.fillna(data.mean()))除了用均值插補(bǔ)之外還可以用中位數(shù)、眾數(shù)、最值、固定值、最近鄰值、拉格朗日等插值,具體方法往前翻,上面剛寫(xiě)完。
OVER!
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的Python数据清洗 - 洗什么?怎么洗?看完就明白了的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: python3语音识别模块_『开源项目』
- 下一篇: python地理_【Python教程】地