![]() 相信大家在處理數(shù)據(jù)的時候經(jīng)常會發(fā)現(xiàn)有一些數(shù)據(jù)的缺失,這個時候便會很頭大,因為有時候的缺失的數(shù)據(jù)是本來就沒有的,這些數(shù)據(jù)不管就好了,有的數(shù)據(jù)雖然沒有,但是也可以根據(jù)一些數(shù)據(jù)推算出來這個數(shù)據(jù)是多少然后給它填上,但是有的數(shù)據(jù)缺失是隨機缺失的完全不知道應該怎么處理,所以呢今天我就帶大家了解一下數(shù)據(jù)中的缺失值以及如何對缺失值進行處理。
相信大家在使用python讀取數(shù)據(jù)的時候會出現(xiàn)這種報錯的情況。 這種情況是因為文件名中有中文,遇到這種情況第一種方式就是講文件名改為英文,或者這樣處理可以。 先使用open打開,然后賦值給變量,然后關閉掉文件,使用被賦值的變量就可以了。 二、處理缺失值 1、什么是缺失值 俗話說知己知彼,百戰(zhàn)百勝,在處理缺失值之前我們首先要了解一下什么是缺失值? 直觀上理解,缺失值表示的是“缺失的數(shù)據(jù)”??梢运伎家粋€問題:是什么原因造成的缺失值呢?其實有很多原因,實際生活中可能由于有的數(shù)據(jù)不全所以導致數(shù)據(jù)缺失,也有可能由于誤操作導致數(shù)據(jù)缺失,又或者人為地造成數(shù)據(jù)缺失,但是主要的還是分為機械原因和人為原因。 機械原因是由于機械原因?qū)е碌臄?shù)據(jù)收集或保存的失敗造成的數(shù)據(jù)缺失,比如數(shù)據(jù)存儲的失敗,存儲器損壞,機械故障導致某段時間數(shù)據(jù)未能收集(對于定時數(shù)據(jù)采集而言)。 人為原因是由于人的主觀失誤、歷史局限或有意隱瞞造成的數(shù)據(jù)缺失,比如,在市場調(diào)查中被訪人拒絕透露相關問題的答案,或者回答的問題是無效的,數(shù)據(jù)錄入人員失誤漏錄了數(shù)據(jù) 缺失值從缺失的分布來講可以分為完全隨機缺失,隨機缺失和完全非隨機缺失。
缺失值從缺失值的所屬屬性來講可以分為單值缺失,任意缺失和單調(diào)缺失。
在Python中缺失值被認為是None、np.nan、NaT的形式。 原理性的東西我們就說這么多,下面我們進入代碼部門,首先我們?nèi)藶榈脑斐梢恍?shù)據(jù)的缺失 然后我們生成一列英雄們的生日的數(shù)據(jù)列 查看數(shù)據(jù)表的信息。 2、轉(zhuǎn)換數(shù)據(jù)列的類型 這個時候我們通過info()方法發(fā)現(xiàn)生日列的類型是object的,需要將生日列的類型通過to_datetime()轉(zhuǎn)換為日期型 3、掩碼提取空值 首先使用isnull()或者notnull()來查看是否缺失 Isnull()是將缺失值判斷為True,非缺失值判斷為False Notnull()將缺失值判斷為False,非缺失值判斷為True
4.1、將不是地球的英雄提取出來
4.2、將1980年之后出生的英雄提取出來 4.3、將1988年1月1號之前出生的英雄提取出來 5、丟棄缺失值 既然在數(shù)據(jù)中有缺失值了,常見的一種處理辦法就是丟棄缺失值。使用 dropna 方法可以丟棄缺失值。 user_info.dropna(axis=0,how='any',thresh=None,subset=None,inplace=False) seriese使用dropna比較簡單,對于DataFrame 來說,可以設置更多的參數(shù)。 axis 參數(shù)用于控制行或列,跟其他不一樣的是,axis=0 (默認)表示操作行,axis=1 表示操作列。 how 參數(shù)可選的值為 any(默認) 或者 all。any 表示一行/列有任意元素為空時即丟棄,all 一行/列所有值都為空時才丟棄。subset 參數(shù)表示刪除時只考慮的索引或列名。thresh參數(shù)的類型為整數(shù),它的作用是,比如 thresh=3,會在一行/列中至少有 3 個非空值時將其保留。
從結(jié)果可以看出,身高列和城市列都存在空值,這樣就被刪除掉了。
從結(jié)果可以看出,鋼鐵俠、索爾因為身高出現(xiàn)空值而被刪除這一行的數(shù)據(jù),奇異博士因為城市出現(xiàn)空值而被刪除一行的數(shù)據(jù),滅霸是年齡出現(xiàn)了空值,但是年齡這一列并未做為刪除的條件所以沒有被刪除掉數(shù)據(jù)。 三、填充缺失值 除了可以丟棄缺失值外,也可以填充缺失值,最常見的是使用fillna完成填充。Fillna這個名字一看就是用來填充缺失值得嘛。 1、固定值填充 填充缺失值時,常見的一種方式是使用一個標量來填充。比如我們可以將缺失的年齡都填充為0。
當然在身高列填充0顯然是不規(guī)范的,咱們這里只做演示使用,大家在實際的處理數(shù)據(jù)的時候還是要跟數(shù)據(jù)結(jié)合起來在選擇填充的標量。 2、上下文填充 除了可以使用標量來填充之外,還可以使用前一個或后一個有效值來填充。設置參數(shù)method=’pad’或method=’ffill’可以使用前一個有效值來填充。 設置參method='bfill'或method='backfill'可以使用后一個有效值來填充。 除了通過fillna方法來填充缺失值外,還可以通過interpolate方法來填充。默認情況下使用線性差值,可以是設置method參數(shù)來改變方式。 3、替換缺失值 現(xiàn)在大家想一想,到底什么才是缺失值呢,不要以為我前邊說過的那些None、np.nan、NaT這些是缺失值,這些在Pandas中被認為是缺失值,但是呢,在我們活生生的人眼中,某些異常值也會被當成缺失值來處理。 例如,在我們的存儲的用戶信息中,假定我們限定用戶都是青年,出現(xiàn)了年齡為40的,我們就可以認為這是一個異常值。 再比如,我們都知道性別分為男性(male)和女性(female),在記錄用戶性別的時候,對于未知的用戶性別都記為了“unknown”,很明顯,我們也可以認為“unknown”是缺失值。 除了這些,有時會也會出現(xiàn)一些空白的字符串,這些也可以認為是缺失值。對于上面的這一系列問題,我們可以使用replace方法來替換缺失值。
除了替換特定的值以外,我們還可以使用正則表達式來替換,如將空白字符串替換為空值。
4、使用其他對象填充 除了我們自己手動丟棄、填充已經(jīng)替換缺失值之外,我們還可以使用其他的對象來填充。 例如我們有兩個用戶年齡的series,其中一個由缺失值,另外一個沒有,我們可以額將沒有缺失值的series的元素傳給有缺失值的。 |
|