Pandas处理数据缺失值
寫(xiě)在篇前
??在數(shù)據(jù)處理實(shí)踐中,數(shù)據(jù)不可能十全十美,總會(huì)由于總總原因,比如不可測(cè)、測(cè)量結(jié)果丟失等原因使得部分?jǐn)?shù)據(jù)缺失,處理缺失值的策略一般分為以下兩種:
通過(guò)維持一個(gè)覆蓋全局的掩碼表示缺失值
??a)維持一個(gè)與數(shù)據(jù)表大小相同的bool值數(shù)組
??b)用一個(gè)bit表示有缺失值的局部狀態(tài)
用一個(gè)標(biāo)簽值(sentinel value)表示缺失值
??一般而言,不存在所謂的最佳選擇,不同的編程語(yǔ)言和系統(tǒng)會(huì)選擇不同的處理方式,在pandas中選用了標(biāo)簽的方式標(biāo)示缺失值,包括浮點(diǎn)類型缺失值NaN、Python單體對(duì)象None。好吧,talk is cheap,show you the code.
缺失值標(biāo)示方法
None標(biāo)示缺失值
>>> import numpy as np >>> vals1 = np.array([1, None, 3, 4]) >>> vals1array([1, None, 3, 4], dtype=object)# None只能用于object類型數(shù)組,這將會(huì)比原生int,float類型更加消耗資源,所以謹(jǐn)慎使用NaN標(biāo)示缺失值
>>> vals2 = np.array([1, np.nan, 3, 4]) >>> vals2 array([ 1., nan, 3., 4.]) >>> vals2.dtype dtype('float64')# 在這種方式中,將以原生類型float64作為數(shù)組類型,將具有更加好的性能 # 原因是這會(huì)被編譯C代碼,從而實(shí)現(xiàn)快速操作# 關(guān)于nan還需要注意幾個(gè)問(wèn)題 >>> vals2.sum() nan >>> np.nansum(vals2) 8.0>>> vals2.min() nan >>> np.nanmin(vals2) 1.0Pandas中None與NaN的差異
?? Pandas把它們看成是可以等價(jià)交換的,在適當(dāng)?shù)臅r(shí)候會(huì)將兩者進(jìn)行替換。
>>> pd.Series([1, np.nan, 2, None]) 0 1.0 1 NaN 2 2.0 3 NaN dtype: float64缺失值處理方法
- isnull() 創(chuàng)建一個(gè)布爾類型的掩碼標(biāo)簽缺失值
- notnull() 與 isnull() 操作相反
- dropna() 返回一個(gè)剔除缺失值的數(shù)據(jù)
- fillna() 返回一個(gè)填充了缺失值的數(shù)據(jù)副本
發(fā)現(xiàn)缺失值
>>> data = pd.Series([1, np.nan, 'hello', None]) >>> data.isnull() 0 False 1 True 2 False 3 True dtype: bool>>> data.notnull() 0 True 1 False 2 True 3 False dtype: bool# 應(yīng)用 >>> data[data.notnull()] 0 1 2 hello dtype: object剔除缺失值
# 剔除缺失值,主要用dropna()函數(shù)def dropna(self, axis=0, how='any', thresh=None, subset=None,inplace=False) # axis 標(biāo)示軸向,0代表行,1代表列 # how 有選項(xiàng) any、all # thresh與 how選項(xiàng)互斥使用,指定一行或一列非缺失值的最小個(gè)數(shù) # subset array-like, optional,表示只將非axis軸所指定行或列納入剔除考慮 # inplace 表示是否要?jiǎng)?chuàng)建新的副本,個(gè)人建議為True,減少資源消耗# subset參數(shù)稍微不好理解,show u the code df = pd.DataFrame([[1, np.nan, 2, 5],[2, 3, 5, 6],[np.nan, 4, 6, 7] ])print(df.dropna(axis=0, how='any', subset=[0, 3]))【output:】 0 1 2 3 0 1.0 NaN 2 5 1 2.0 3.0 5 6解析:在本例中,明明指定了按行剔除,只要有any缺失值就踢除改行,但是第一行卻保留了,納尼?這就是subset的作用,因?yàn)槲覀冊(cè)趕ubset參數(shù)中指定了是看第0、3列有沒(méi)有缺失值從而決定是否剔除該列。填充缺失值
??數(shù)據(jù)是寶貴的,有時(shí)候我們并不忍心刪除一些記錄,這時(shí)候我們就需要考慮用何種方式對(duì)缺失值進(jìn)行修復(fù),這就是缺失值填充。其實(shí)缺失值填充的策略非常之多,這里主要介紹Pandas內(nèi)置的填充方式,具體用哪種方式,這也許真的需要具體任務(wù)具體分析。
# 函數(shù)主要參數(shù) def fillna(self, value=None, method=None, axis=None, inplace=False)# value 表示填充特定值 # method 表示填充方式,與value互斥使用,有從后往前填充(method='ffill'),從前往后填充(method='bfill') # axis 表示軸向,在ffill與bfill方式中有區(qū)別,注意體會(huì) # inplace 表示是否要?jiǎng)?chuàng)建新的副本,個(gè)人建議為True,減少資源消耗# 例子 data = pd.Series([1, np.nan, 2, None, 3], index=list('abcde')) print(data.fillna(value=0))a 1.0 b 0.0 c 2.0 d 0.0 e 3.0 dtype: float64總結(jié)
??在這一篇中,主要總結(jié)了pandas中的缺失值處理方式,但是實(shí)際上處理缺失值的方式非常靈活,需要具體任務(wù)具體分析,甚至自定義一種處理方式。要自定義處理,就需要掌握好一些pandas數(shù)據(jù)集的處理技巧,可以參考我之前的博客pandas 數(shù)據(jù)分析常用技巧,比如其中的apply、applymap、map等方法對(duì)于定義高級(jí)數(shù)據(jù)操作極其方便、重要。
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的Pandas处理数据缺失值的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: python re 正则表达式
- 下一篇: 【Numpy学习记录】np.cov详解