重磅干貨,第一時間送達(dá) 作者:KOALA https://zhuanlan.zhihu.com/p/60241672 臟數(shù)據(jù)就是在物理上臨時存在過,但在邏輯上不存在的數(shù)據(jù)。數(shù)據(jù)清洗是整個數(shù)據(jù)分析過程的第一步,就像做一道菜之前需要先擇菜洗菜一樣。數(shù)據(jù)分析師經(jīng)常需要花費(fèi)大量的時間來清洗數(shù)據(jù)或者轉(zhuǎn)換格式,這個工作甚至?xí)颊麄€數(shù)據(jù)分析流程的80%左右的時間。 在這篇文章中,我嘗試簡單地歸納一下用Python來做數(shù)據(jù)清洗的7步過程,供大家參考。 一、數(shù)據(jù)預(yù)處理 一、數(shù)據(jù)預(yù)處理
#導(dǎo)入數(shù)據(jù)分析包
2. 嘗試去理解這份數(shù)據(jù)集 我們可以通過對數(shù)據(jù)集提問來判斷這份數(shù)據(jù)能不能滿足解答我們的問題,數(shù)據(jù)是否干凈需不需要進(jìn)一步處理,問題包括但不限于: 數(shù)據(jù)集多少數(shù)據(jù)? 3. 下面我們就結(jié)合代碼來看一下數(shù)據(jù) #1 從宏觀一點(diǎn)的角度去看數(shù)據(jù):查看dataframe的信息 也可以用這兩條來看:
# 2.檢查缺失數(shù)據(jù)
可以看到: 1)Country和UnitPrice都出現(xiàn)了NaN值,需要去掉 2)InvoiceDate的時間出現(xiàn)具體時分,可以刪去 3)Description大概率是人工填寫的數(shù)據(jù),一般都會有比較多格式問題。 猜測會存在有標(biāo)點(diǎn)符號摻雜/大小寫不一致等問題,所以進(jìn)一步這些人工填寫數(shù)據(jù)的去重項(xiàng)拎出來研究一下 # 查看這個商品名稱的去重項(xiàng)
發(fā)現(xiàn)有很多空格的問題 根據(jù)第一步數(shù)據(jù)預(yù)處理后,整理一下該數(shù)據(jù)集有下列問題需要處理: 1)調(diào)整數(shù)據(jù)類型:由于一開始用到了str來導(dǎo)入,打算后期再更換格式,需要調(diào)整數(shù)據(jù)類型。 2)修改列名:該數(shù)據(jù)的名稱不易于理解,需要改列名 3)選擇部分子集:因?yàn)橛胁糠至性跀?shù)據(jù)分析中不需要用到 4)可能存在邏輯問題需要篩選:比如Unit Price為負(fù) 5)格式一致化:Description可能會存在有標(biāo)點(diǎn)符號摻雜/大小寫不一致/空格重復(fù)出現(xiàn)等問題 6)消滅空值:CustomerID、Description、Country和UnitPrice都出現(xiàn)了NaN值,需要去掉 于是下面就開始后續(xù)的數(shù)據(jù)清洗6步 二、調(diào)整數(shù)據(jù)類型 #字符串轉(zhuǎn)換為數(shù)值(整型)
![]() 三、修改列名 ![]() #建立字典字典:舊列名和新列名對應(yīng)關(guān)系 ![]() 四、選擇部分子集 這是一個8列*541909行的數(shù)據(jù)集。 ![]() ![]()
![]() #選擇子集,選擇其中兩列 ![]() https://pandas./pandas-docs/stable/reference/api/pandas.DataFrame.loc.html#pandas.DataFrame.loc
以逗號作為隔開的界限,左邊為index,右邊為column
![]() ![]() subDataDF2=DataDF.loc[0:9,:] ![]() ![]()
![]() ![]()
還是Dataframe.loc這個函數(shù)的知識點(diǎn)。 由于loc還可以判斷條件是否為True DataDF.loc[:,'UnitPrice']>0 ![]() ![]() 一般來說價格不能為負(fù),所以從邏輯上來說如果價格是小于0的數(shù)據(jù)應(yīng)該予以篩出
![]() 六、格式一致化
將我們數(shù)據(jù)中所有的Descrption改成大寫: DataDF['Description']= DataDF['Description'].str.upper() 類似的代碼還有 字符串修改方法:
2. 去除字符串符號 去亂碼 3. 空格分割 #定義函數(shù):分割I(lǐng)nvoiceDate,獲取InvoiceDate 最后再賦值回去
七、處理缺失值 python缺失值有3種: 1)Python內(nèi)置的None值 2)在pandas中,將缺失值表示為NA,表示不可用not available。 3)對于數(shù)值數(shù)據(jù),pandas使用浮點(diǎn)值NaN(Not a Number)表示缺失數(shù)據(jù)。后面出來數(shù)據(jù),如果遇到錯誤:說什么float錯誤,那就是有缺失值,需要處理掉 所以,缺失值有3種:None,NA,NaN 那None和NaN有什么區(qū)別呢: None是Python的一種數(shù)據(jù)類型, NaN是浮點(diǎn)類型 兩個都用作空值 ![]() 1、去除缺失值 # 再一次提醒檢查缺失數(shù)據(jù) 去除缺失值的知識點(diǎn): DataFrame.dropna DataFrame.dropna(axis=0, how='any', thresh=None, subset=None, inplace=False)
2、填充缺失內(nèi)容:某些缺失值可以進(jìn)行填充,方法有以下四種: 1) 以業(yè)務(wù)知識或經(jīng)驗(yàn)推測(默認(rèn)值)填充缺失值 2) 以同一指標(biāo)的計算結(jié)果(均值、中位數(shù)、眾數(shù)等)填充缺失值 3) 用相鄰值填充缺失值 4) 以不同指標(biāo)的計算結(jié)果填充缺失值 去除缺失值的知識點(diǎn): DataFrame.fillna https://pandas./pandas-docs/stable/reference/api/pandas.DataFrame.fillna.html#pandas.DataFrame.fillna 1) 用默認(rèn)值填充- df.fillna(' ') 我們應(yīng)該去掉那些不友好的 NaN 值。但是,我們應(yīng)該用什么值替換呢?這個時候可能要結(jié)合你對這個數(shù)據(jù)集的理解,看填充什么數(shù)據(jù)才是比較合適,以下是一下常用的方法。 在這個數(shù)據(jù)集中,我們大致判斷CustomerID如果是不太重要的,就我們可以用使用''空字符串或其他默認(rèn)值。 DataDF.Country= DataDF.Country.fillna('Not Given') 上面,我們就將“country”整個列使用“”空字符串替換了,或者,我們也可以輕易地使用“Not Given”這樣的默認(rèn)值進(jìn)行替換。 如果想了解更多 fillna() 的詳細(xì)信息參考 pandas.DataFrame.fillna pandas. 2) 以同一指標(biāo)的計算結(jié)果(均值、中位數(shù)、眾數(shù)等)填充缺失值 平均值- df.fillna(df.mean()) 使用數(shù)字類型的數(shù)據(jù)有可能可以通過這樣的方法來去減少錯誤。 比如,這個案例里面的價格。如果用0或者'Not Given'等來去填充都不太合適,但這個大概的價格是可以根據(jù)其他數(shù)據(jù)估算出來的。
3)除此,還有一種常見的方法,就是用相鄰的值進(jìn)行填充, 這在時間序列分析中相當(dāng)常見,用前面相鄰的值向后填充,也可以用后面相鄰的值向前填充。 print(DataDF) ![]() 4) 以不同指標(biāo)的計算結(jié)果填充缺失值 關(guān)于這種方法年齡字段缺失,但是有屏蔽后六位的身份證號可以推算具體的年齡是多少。 參考來源: |
|