怎么使用Python進(jìn)行數(shù)據(jù)清洗

這篇文章主要講解了“怎么使用Python進(jìn)行數(shù)據(jù)清洗”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“怎么使用Python進(jìn)行數(shù)據(jù)清洗”吧!

創(chuàng)新互聯(lián)是一家專業(yè)提供昭化企業(yè)網(wǎng)站建設(shè),專注與網(wǎng)站設(shè)計(jì)、成都網(wǎng)站設(shè)計(jì)、html5、小程序制作等業(yè)務(wù)。10年已為昭化眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)網(wǎng)站設(shè)計(jì)公司優(yōu)惠進(jìn)行中。

缺失值

當(dāng)數(shù)據(jù)集中包含缺失數(shù)據(jù)時(shí),在填充之前可以先進(jìn)行一些數(shù)據(jù)的分析。 因?yàn)榭諉卧癖旧淼奈恢每梢愿嬖V我們一些有用的信息。 例如:

  • NA值僅在數(shù)據(jù)集的尾部或中間出現(xiàn)。 這意味著在數(shù)據(jù)收集過程中可能存在技術(shù)問題。 可能需要分析該特定樣本序列的數(shù)據(jù)收集過程,并嘗試找出問題的根源。

  • 如果列NA數(shù)量超過 70–80%,可以刪除該列。

  • 如果 NA 值在表單中作為可選問題的列中,則該列可以被額外的編碼為用戶回答(1)或未回答(0)。

missingno這個(gè)python庫就可以用于檢查上述情況,并且使用起來非常的簡單,例如下圖中的白線是 NA:

import missingno as msno
msno.matrix(df)

怎么使用Python進(jìn)行數(shù)據(jù)清洗

對于缺失值的填補(bǔ)計(jì)算有很多方法,例如:

  • 平均,中位數(shù),眾數(shù)

  • kNN

  • 零或常數(shù)等

不同的方法相互之間有優(yōu)勢和不足,并且沒有適用于所有情況的“最佳”技術(shù)。具體可以參考我們以前發(fā)布的文章

異常值

異常值是相對于數(shù)據(jù)集的其他點(diǎn)而言非常大或非常小的值。 它們的存在極大地影響了數(shù)學(xué)模型的性能。 讓我們看一下這個(gè)簡單的示例:

怎么使用Python進(jìn)行數(shù)據(jù)清洗

在左圖中沒有異常值,我們的線性模型非常適合數(shù)據(jù)點(diǎn)。 在右圖中有一個(gè)異常值,當(dāng)模型試圖覆蓋數(shù)據(jù)集的所有點(diǎn)時(shí),這個(gè)異常值的存在會改變模型的擬合方式,并且使我們的模型不適合至少一半的點(diǎn)。

對于異常值來說我們有必要介紹一下如何確定異常,這就要從數(shù)學(xué)角度明確什么是極大或極小。

大于Q3+1.5 x IQR或小于Q1-1.5 x IQR都可以作為異常值。 IQR(四分位距) 是 Q3 和 Q1 之間的差 (IQR = Q3-Q1)。

可以使用下面函數(shù)來檢查數(shù)據(jù)集中異常值的數(shù)量:

def number_of_outliers(df):

df = df.select_dtypes(exclude = 'object')

Q1 = df.quantile(0.25)
Q3 = df.quantile(0.75)
IQR = Q3 - Q1

return ((df < (Q1 - 1.5 * IQR)) | (df > (Q3 + 1.5 * IQR))).sum()

處理異常值的一種方法是可以讓它們等于 Q3 或 Q1。 下面的lower_upper_range 函數(shù)使用 pandas 和 numpy 庫查找其外部為異常值的范圍, 然后使用clip 函數(shù)將值裁剪到指定的范圍。

def lower_upper_range(datacolumn):
sorted(datacolumn)
Q1,Q3 = np.percentile(datacolumn , [25,75])
IQR = Q3 - Q1
lower_range = Q1 - (1.5 * IQR)
upper_range = Q3 + (1.5 * IQR)
return lower_range,upper_range

for col in columns: 
lowerbound,upperbound = lower_upper_range(df[col])
df[col]=np.clip(df[col],a_min=lowerbound,a_max=upperbound)
數(shù)據(jù)不一致

異常值問題是關(guān)于數(shù)字特征的,現(xiàn)在讓我們看看字符類型(分類)特征。 數(shù)據(jù)不一致意味著列的唯一類具有不同的表示形式。 例如在性別欄中,既有m/f,又有male/female。在這種情況下,就會有4個(gè)類,但實(shí)際上有兩類。

這種問題目前沒有自動處理的辦法,所以需要手動進(jìn)行分析。 pandas 的unique函數(shù)就是為了這個(gè)分析準(zhǔn)備的,下面看一個(gè)汽車品牌的例子:

df['CarName'] = df['CarName'].str.split().str[0]
print(df['CarName'].unique())

怎么使用Python進(jìn)行數(shù)據(jù)清洗

maxda-mazda, Nissan-nissan, porcshce-porsche, toyouta-toyota等都可以進(jìn)行合并。

df.loc[df['CarName'] == 'maxda', 'CarName'] = 'mazda'
df.loc[df['CarName'] == 'Nissan', 'CarName'] = 'nissan'
df.loc[df['CarName'] == 'porcshce', 'CarName'] = 'porsche'
df.loc[df['CarName'] == 'toyouta', 'CarName'] = 'toyota'
df.loc[df['CarName'] == 'vokswagen', 'CarName'] = 'volkswagen'
df.loc[df['CarName'] == 'vw', 'CarName'] = 'volkswagen'
無效數(shù)據(jù)

無效的數(shù)據(jù)表示在邏輯上根本不正確的值。 例如,

  • 某人的年齡是 560;

  • 某個(gè)操作花費(fèi)了 -8 小時(shí);

  • 一個(gè)人的身高是1200 cm等;

對于數(shù)值列,pandas的 describe 函數(shù)可用于識別此類錯(cuò)誤:

df.describe()

怎么使用Python進(jìn)行數(shù)據(jù)清洗

無效數(shù)據(jù)的產(chǎn)生原因可能有兩種:

1、數(shù)據(jù)收集錯(cuò)誤:例如在輸入時(shí)沒有進(jìn)行范圍的判斷,在輸入身高時(shí)錯(cuò)誤的輸入了1799cm 而不是 179cm,但是程序沒有對數(shù)據(jù)的范圍進(jìn)行判斷。

2、數(shù)據(jù)操作錯(cuò)誤

數(shù)據(jù)集的某些列可能通過了一些函數(shù)的處理。 例如,一個(gè)函數(shù)根據(jù)生日計(jì)算年齡,但是這個(gè)函數(shù)出現(xiàn)了BUG導(dǎo)致輸出不正確。

以上兩種隨機(jī)錯(cuò)誤都可以被視為空值并與其他 NA 一起估算。

重復(fù)數(shù)據(jù)

當(dāng)數(shù)據(jù)集中有相同的行時(shí)就會產(chǎn)生重復(fù)數(shù)據(jù)問題。 這可能是由于數(shù)據(jù)組合錯(cuò)誤(來自多個(gè)來源的同一行),或者重復(fù)的操作(用戶可能會提交他或她的答案兩次)等引起的。 處理該問題的理想方法是刪除復(fù)制行。

可以使用 pandas duplicated 函數(shù)查看重復(fù)的數(shù)據(jù):

df.loc[df.duplicated()]

在識別出重復(fù)的數(shù)據(jù)后可以使用pandas 的 drop_duplicate 函數(shù)將其刪除:

df.drop_duplicates()
數(shù)據(jù)泄漏問題

在構(gòu)建模型之前,數(shù)據(jù)集被分成訓(xùn)練集和測試集。 測試集是看不見的數(shù)據(jù)用于評估模型性能。 如果在數(shù)據(jù)清洗或數(shù)據(jù)預(yù)處理步驟中模型以某種方式“看到”了測試集,這個(gè)就被稱做數(shù)據(jù)泄漏(data leakage)。 所以應(yīng)該在清洗和預(yù)處理步驟之前拆分?jǐn)?shù)據(jù):

怎么使用Python進(jìn)行數(shù)據(jù)清洗

以選擇缺失值插補(bǔ)為例。數(shù)值列中有 NA,采用均值法估算。在 split 前完成時(shí),使用整個(gè)數(shù)據(jù)集的均值,但如果在 split 后完成,則使用分別訓(xùn)練和測試的均值。

第一種情況的問題是,測試集中的推算值將與訓(xùn)練集相關(guān),因?yàn)槠骄凳钦麄€(gè)數(shù)據(jù)集的。所以當(dāng)模型用訓(xùn)練集構(gòu)建時(shí),它也會“看到”測試集。但是我們拆分的目標(biāo)是保持測試集完全獨(dú)立,并像使用新數(shù)據(jù)一樣使用它來進(jìn)行性能評估。所以在操作之前必須拆分?jǐn)?shù)據(jù)集。

雖然訓(xùn)練集和測試集分別處理效率不高(因?yàn)橄嗤牟僮餍枰M(jìn)行2次),但它可能是正確的。因?yàn)閿?shù)據(jù)泄露問題非常重要,為了解決代碼重復(fù)編寫的問題,可以使用sklearn 庫的pipeline。簡單地說,pipeline就是將數(shù)據(jù)作為輸入發(fā)送到的所有操作步驟的組合,這樣我們只要設(shè)定好操作,無論是訓(xùn)練集還是測試集,都可以使用相同的步驟進(jìn)行處理,減少的代碼開發(fā)的同時(shí)還可以減少出錯(cuò)的概率。

感謝各位的閱讀,以上就是“怎么使用Python進(jìn)行數(shù)據(jù)清洗”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對怎么使用Python進(jìn)行數(shù)據(jù)清洗這一問題有了更深刻的體會,具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識點(diǎn)的文章,歡迎關(guān)注!

分享文章:怎么使用Python進(jìn)行數(shù)據(jù)清洗
標(biāo)題來源:http://muchs.cn/article26/ghgijg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供微信小程序、網(wǎng)站收錄外貿(mào)建站、自適應(yīng)網(wǎng)站、搜索引擎優(yōu)化、做網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都seo排名網(wǎng)站優(yōu)化