用Pandas做數(shù)據(jù)清洗,我一般都這么干……【文末送書】
導讀
作為一名數(shù)據(jù)分析師,每天都在完成各種數(shù)據(jù)分析需求,其中數(shù)據(jù)清洗是必不可少的一個步驟。一般而言,當提及數(shù)據(jù)清洗時,其實是主要包括了缺失值處理、重復值處理和異常值處理三類操作,本文即圍繞這這三個方面介紹一下個人的一些習慣操作。

文末送書
缺失值是各類數(shù)據(jù)集中經(jīng)常會遇到的情形,相較于工整完全的數(shù)據(jù)記錄,帶有一定的缺失值更接近于數(shù)據(jù)的真實原貌。一般而言,缺失值處理的原則無非就是以下三種:
缺失比例較小,可直接過濾掉缺失值所在行
缺失比例較大,根據(jù)特定的業(yè)務理解進行一定規(guī)則的填充
缺失記錄有特定業(yè)務含義,不做任何處理
至于在實際數(shù)據(jù)分析中應該采取哪種方案來處理,這個要結(jié)合具體的數(shù)據(jù)分析場景和業(yè)務需求,不可一概而論。所以,這里僅給出基于Pandas的具體處理方法。
1.?過濾掉缺失值所在行
在過濾之前,首先要分析缺失比例的大小,其基礎(chǔ)在于判斷各個值是否為空,pandas提供了4個相關(guān)API,包括
isna(), isnull(),二者等價
notna(),?notnull(),二者等價


2.?對缺失值進行填充
有些情況下,對缺失值直接進行過濾會導致樣本分布受到影響。同時基于特定的業(yè)務理解,可以采取一定的規(guī)則進行填充,一般而言填充的方式包括兩大類:特定值和特定規(guī)則。缺失值的填充API主要是用fillna(),當然也可手動用缺失值篩選+賦值的形式完成這一操作。
特定值填充。特定值填充一般是對缺失的位置填充某種特定值,當然這里的特定值一般又可細分為3種情況:常數(shù),均值,眾數(shù),其中均值填充主要適用于取值連續(xù)的情形,而眾數(shù)填充則適用于取值離散的情形,常數(shù)值填充則是基于特定的業(yè)務含義。舉個例子:

特定規(guī)則填充。在某些不適合利用常數(shù)值填充的情況下時,基于特定場景可基于特定規(guī)則填充,例如得到疫情期間各地累計感染人數(shù),當某地某天的感染人數(shù)最新數(shù)字缺失時,我們可以用其前一天的感染人數(shù)填充。這實際上就是前向填充,類似地還有后向填充。再比如,獲取一天各時刻的溫度值,當某一時刻溫度數(shù)據(jù)缺失時,那么實際上可基于前后記錄擬合插值的方式填充。

與缺失值一樣,重復值也是數(shù)據(jù)分析中經(jīng)常遇到的一種情形,一般是由于樣本重復記錄或重復讀取造成。當然,根據(jù)特定的分析場景和業(yè)務需求,對于重復值的處理實際上也包含兩種情況:
對重復值進行過濾
重復值存在合理性,不做處理

類似地,執(zhí)行重復值過濾的接口為drop_duplicates(),仍然可選keep參數(shù)保留不同不同的重復記錄:

另外,在某些情況下不需要針對所有列進行重復值判斷,而是僅在特定幾列范圍內(nèi)展開去重,此時drop_duplicates還可選一個參數(shù)subset,接收列名序列。
不同于缺失值和重復值那樣規(guī)則相對明朗,異常值的處理相對更為復雜。首先要基于業(yè)務理解出什么情況下算作是異常值,其次還要指定異常值的處理規(guī)則,要么是對異常值所在記錄進行過濾,要么是按照一定的規(guī)則進行轉(zhuǎn)換,使得異常值變?yōu)?正常值"。
基于數(shù)值范圍,對于取值連續(xù)的情形,可判斷數(shù)值的絕對大小是否在合理范圍,分布是否在箱線圖之間,例如車速的大小一般可用[0, 120]作為合理區(qū)間進行判斷;對于取值離散的情形,可判斷取值是否在指定的候選集之間,例如性別的取值范圍可能包括男、女和未知三種。
基于特定業(yè)務含義,例如每條記錄中的兩個字段對應了明確的大小或先后關(guān)系,當不滿足這一關(guān)系時可判斷為異常值。例如城市抓拍過車記錄中,對于一條包括出發(fā)時間和到達時間的車輛行駛記錄,當?shù)竭_時間小于等于出發(fā)時間時,或者到達時間與出發(fā)時間的時間差小于某個閾值時,都可以認為是異常記錄
基于特定業(yè)務含義,單條記錄并無異常,但放在整個數(shù)據(jù)集中則是異常記錄。例如仍以城市抓拍車輛出行為例,雖然從單條記錄來看并無異常之處,但對于整個數(shù)據(jù)集來看,某車牌號在全天僅出現(xiàn)1次,那么相較于該車牌號確實僅出現(xiàn)1次而言,認為該記錄中的車牌號識別錯誤的可能性更為合理,因為該條記錄也應認為是異常記錄。
這里以某真實GPS數(shù)據(jù)集為例,原始數(shù)據(jù)集如下:

以速度字段為例,首先判斷其取值分布情況:

繪圖接口:seaborn.boxenplot()



3. 基于整個數(shù)據(jù)集進行整體判斷

對groupby的各種操作不熟悉的,可參考歷史文章Pandas中g(shù)roupby的這些用法你都知道嗎?
最后,感謝北京大學出版社贊助,送書《Python數(shù)據(jù)分析全流程實操指南》1本:
內(nèi)容簡介:
送書規(guī)則:截至本周三12月2日晚20:00,公眾號后臺查看分享最多前3名中挑選一名幸運讀者,屆時會通過截圖公布結(jié)果并添加微信聯(lián)系,歡迎各位多多分享在看點贊。另外,后續(xù)將不定期開啟送書活動。

相關(guān)閱讀:
