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