- Python廣告數(shù)據(jù)挖掘與分析實(shí)戰(zhàn)
- 楊游云 周健
- 1405字
- 2021-04-02 14:21:24
3.2.6 廣告缺失值處理
數(shù)據(jù)缺失在數(shù)據(jù)分析工作中是普遍存在的,而造成數(shù)據(jù)缺失的原因又是多種多樣的,有的是因?yàn)閿?shù)據(jù)無法獲取或者獲取數(shù)據(jù)的代價(jià)太大,有的是因?yàn)樾畔⒉杉捌诒贿z漏或者設(shè)備故障問題導(dǎo)致數(shù)據(jù)丟失,還有的可能是因?yàn)閿?shù)據(jù)不可用而舍棄導(dǎo)致的缺失。
按缺失的情況,我們一般將數(shù)據(jù)缺失分為完全隨機(jī)缺失、隨機(jī)缺失和完全非隨機(jī)缺失。它們的具體定義如下。
1)完全隨機(jī)缺失:數(shù)據(jù)的缺失是完全隨機(jī)的,與其他變量無關(guān)。
2)隨機(jī)缺失:該類數(shù)據(jù)的缺失依賴于其他變量,與所觀察的變量有關(guān),與未觀察的變量無關(guān)。
3)完全非隨機(jī)缺失:數(shù)據(jù)的缺失與變量自身的取值有關(guān)。
所以缺失值的處理要具體問題具體分析。在廣告行業(yè)中,數(shù)據(jù)的缺失主要是因?yàn)闊o法獲取數(shù)據(jù)導(dǎo)致的。缺失值的處理方法主要包括三種:不處理、刪除缺失數(shù)據(jù)、填充缺失值。只有當(dāng)我們對數(shù)據(jù)進(jìn)行刪除或者填充操作會(huì)對當(dāng)前分析結(jié)果帶來影響,或者我們明確知道該缺失數(shù)據(jù)對分析結(jié)果完全不會(huì)有影響時(shí),我們才會(huì)對缺失值進(jìn)行不處理操作。除此之外,我們一般都會(huì)對缺失數(shù)據(jù)進(jìn)行相應(yīng)的處理,而刪除缺失數(shù)據(jù)和填充缺失值是比較常用的方法。Pandas提供了一些常用的數(shù)據(jù)缺失值處理方法,使得數(shù)據(jù)缺失值的處理簡單高效了。
在Pandas的數(shù)據(jù)對象中一般用NaN表示缺失值,比如前面我們在進(jìn)行數(shù)據(jù)拼接時(shí)就出現(xiàn)了因?yàn)樽笥覂蓚€(gè)表部分?jǐn)?shù)據(jù)拼接不上而導(dǎo)致數(shù)據(jù)缺失的情況。在Pandas中我們通常使用isnull方法來獲取缺失值的位置:
In [3]: df = pd.DataFrame({"ID":[1,2,np.NaN,4,5], ...: "Name":['A',np.NaN,np.NaN,"D","E"], ... "No":[100,101,102,103,105]}) In [4]: df.isnull() Out[4]: ID Name No 0 False False False 1 False True False 2 True True False 3 False False False 4 False False False
也可以在isnull方法后使用聚合函數(shù)來進(jìn)行匯總,以便后續(xù)觀察字段的整體缺失情況:
In [5]: df.isnull().mean() Out[5]: ID 0.2 Name 0.4 No 0.0 dtype: float64
從以上結(jié)果可以看出,ID和Name字段的缺失值比例分別為0.2和0.4。
還可以使用notnull方法來獲取非缺失值的位置:
In [6]: df.notnull() Out[6]: ID Name No 0 True True True 1 True False True 2 False False True 3 True True True 4 True True True
可以看到,返回的結(jié)果剛好與isnull方法相反。
前面我們介紹了如何通過isnull/notnull方法來判斷缺失值的位置,從而快速找出缺失值,下面將分別介紹在廣告數(shù)據(jù)分析中常用的兩種缺失值處理方法:刪除缺失值和填充缺失值。
(1)刪除缺失值
在Pandas中,通常使用dropna方法刪除缺失數(shù)據(jù):
In [7]: df.dropna() Out[7]: ID Name No 0 1.0 A 100 3 4.0 D 103 4 5.0 E 105
可以發(fā)現(xiàn),dropna方法刪除了所有含有缺失值的行。在上面的例子中,在刪除缺失值后只保留了第1、4、5行的數(shù)據(jù)。但在實(shí)際中往往只需要?jiǎng)h除全為缺失值的行,這里只需要修改參數(shù)how=‘a(chǎn)ll’即可:
In [8]: df.dropna(how = 'all') Out[8]: ID Name No 0 1.0 A 100 1 2.0 NaN 101 2 NaN NaN 102 3 4.0 D 103 4 5.0 E 105
通過dropna方法我們還可以刪除含缺失值的列:
In [9]: df.dropna(axis=1) Out[9]: No 0 100 1 101 2 102 3 103 4 105
(2)填充缺失值
通過fillna方法我們可以將缺失值填充為任何我們想要的值,如下所示:
In [10]: df.fillna('miss') Out[10]: ID Name No 0 1 A 100 1 2 miss 101 2 miss miss 102 3 4 D 103 4 5 E 105
在以上情況下所有缺失值都會(huì)替換為miss,如果想在不同的列中填充不同的值,可以傳入一個(gè)字典,字典的鍵指定需要填充的列名,字典的值指定需要填充的值,如下所示:
In [11]: df.fillna({'ID':3,"Name":'miss'}) Out[11]: ID Name No 0 1.0 A 100 1 2.0 miss 101 2 3.0 miss 102 3 4.0 D 103 4 5.0 E 105
在廣告數(shù)據(jù)分析中,我們也經(jīng)常采用列的平均值(mean)、中位數(shù)(median)或者眾數(shù)(mode)來填充缺失值。這樣做的好處是可以盡量減少噪聲對整體數(shù)據(jù)的影響。
In [12]: df.loc[4,'ID'] = np.NaN In [13]: df Out[13]: ID Name No 0 1.0 A 100 1 2.0 NaN 101 2 NaN NaN 102 3 4.0 D 103 4 NaN E 105 In [14]: df.fillna(df.mean()) Out[14]: ID Name No 0 1.000000 A 100 1 2.000000 NaN 101 2 2.333333 NaN 102 3 4.000000 D 103 4 2.333333 E 105
因?yàn)榫堤畛渲粚B續(xù)變量有效,所以Name列的缺失值會(huì)被忽略。如果我們想對離散變量也進(jìn)行相應(yīng)的缺失值填充,可以有針對性地單獨(dú)指定需要填充的值,類似前面的miss填充,這里不再贅述。
- Hands-On Data Structures and Algorithms with Rust
- 數(shù)據(jù)庫原理及應(yīng)用教程(第4版)(微課版)
- 數(shù)據(jù)分析實(shí)戰(zhàn):基于EXCEL和SPSS系列工具的實(shí)踐
- Java Data Science Cookbook
- 數(shù)據(jù)庫開發(fā)實(shí)踐案例
- 數(shù)據(jù)庫系統(tǒng)原理及應(yīng)用教程(第4版)
- 3D計(jì)算機(jī)視覺:原理、算法及應(yīng)用
- 數(shù)據(jù)驅(qū)動(dòng)設(shè)計(jì):A/B測試提升用戶體驗(yàn)
- 一個(gè)64位操作系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)
- 區(qū)塊鏈技術(shù)應(yīng)用與實(shí)踐案例
- 深入理解InfluxDB:時(shí)序數(shù)據(jù)庫詳解與實(shí)踐
- Deep Learning with R for Beginners
- Access 2016數(shù)據(jù)庫應(yīng)用基礎(chǔ)
- 碼上行動(dòng):利用Python與ChatGPT高效搞定Excel數(shù)據(jù)分析
- Arquillian Testing Guide