更新時(shí)間:2021年01月18日16時(shí)02分 來(lái)源:傳智教育 瀏覽次數(shù):
前期采集到的數(shù)據(jù),或多或少都存在一些瑕疵和不足,比如數(shù)據(jù)缺失、極端值、數(shù)據(jù)格式不統(tǒng)一等問(wèn)題。因此,在分析數(shù)據(jù)之前需要對(duì)數(shù)據(jù)進(jìn)行預(yù)處理,包括數(shù)據(jù)的清洗、合并、重塑與轉(zhuǎn)換。Pandas中專門(mén)提供了用于數(shù)據(jù)預(yù)處理的很多函數(shù)與方法,用于替換異常數(shù)據(jù)、合并數(shù)據(jù)、重塑數(shù)據(jù)等。
數(shù)據(jù)清洗是一項(xiàng)復(fù)雜且繁瑣的工作,同時(shí)也是整個(gè)數(shù)據(jù)分析過(guò)程中最為重要的環(huán)節(jié)。數(shù)據(jù)清洗的目的在于提高數(shù)據(jù)質(zhì)量,將臟數(shù)據(jù)(臟數(shù)據(jù)在這里指的是對(duì)數(shù)據(jù)分析沒(méi)有實(shí)際意義、格式非法、不在指定范圍內(nèi)的數(shù)據(jù))清洗干凈,使原數(shù)據(jù)具有完整性、唯一性、權(quán)威性、合法性、一致性等特點(diǎn)。Pandas中常見(jiàn)的數(shù)據(jù)清洗操作有空值和缺失值的處理、重復(fù)值的處理、異常值的處理、統(tǒng)一數(shù)據(jù)格式等等。
空值一般表示數(shù)據(jù)未知、不適用或?qū)⒃谝院筇砑訑?shù)據(jù)。缺失值是指數(shù)據(jù)集中某個(gè)或某些屬性的值是不完整的,產(chǎn)生的原因主要有人為原因和機(jī)械原因兩種,其中機(jī)械原因是由于機(jī)器故障造成數(shù)據(jù)未能收集或存儲(chǔ)失敗,人為原因是由主觀失誤或有意隱瞞造成的數(shù)據(jù)缺失。
一般空值使用None表示,缺失值使用NaN表示。Pandas中提供了一些用于檢查或處理空值和缺失值的函數(shù),其中,使用isnull()和notnull()函數(shù)可以判斷數(shù)據(jù)集中是否存在空值和缺失值,對(duì)于缺失數(shù)據(jù)可以使用dropna()和fillna()方法對(duì)缺失值進(jìn)行刪除和填充,下面來(lái)一一介紹。
1. isnull()函數(shù)
isnull()函數(shù)的語(yǔ)法格式如下:
pandas.isnull(obj)
上述函數(shù)中只有一個(gè)參數(shù)obj,表示檢查空值的對(duì)象,該函數(shù)會(huì)返回一個(gè)布爾類型的值,如果返回的結(jié)果為T(mén)rue,則說(shuō)明有空值或缺失值,否則為False。(NaN或None映射到True值,其它內(nèi)容映射到False)
接下來(lái),通過(guò)一段示例來(lái)演示如何通過(guò)isnull()函數(shù)來(lái)檢查缺失值或空值,具體代碼如下:
In [1]: from pandas import DataFrame, Series import pandas as pd from numpy import NaN series_obj = Series([1, None, NaN]) pd.isnull(series_obj) # 檢查是否為空值或缺失值 Out[1]: 0 False 1 True 2 True dtype:bool
上述示例中,首先創(chuàng)建了一個(gè)Series對(duì)象,該對(duì)象中包含1、None和NaN三個(gè)值,然后調(diào)用isnull()函數(shù)檢查Series對(duì)象中的數(shù)據(jù),數(shù)據(jù)為空值或缺失值就映射為T(mén)rue,其余值就映射為False。從輸出結(jié)果看出,第一個(gè)數(shù)據(jù)是正常的,后兩個(gè)數(shù)據(jù)是空值或缺失值。
2. notnull()函數(shù)
notnull()函數(shù)與isnull()函數(shù)的功能是一樣的,都是判斷數(shù)據(jù)中是否存在空值或缺失值,不同之處在于,前者發(fā)現(xiàn)數(shù)據(jù)中有空值或缺失值時(shí)返回False,后者返回的是True。
將上述調(diào)用isnull()函數(shù)的代碼改為調(diào)用notnull()函數(shù),改后的代碼如下:
In [2]: from pandas import DataFrame, Series import pandas as pd from numpy import NaN series_obj = Series([1, None, NaN]) pd.notnull(series_obj) # 檢查是否不為空值或缺失值 Out[2]: 0 True 1 False 2 False dtype: bool
上述示例中,通過(guò)notnull()函數(shù)來(lái)檢查空值或缺失值,只要出現(xiàn)空值或缺失值就映射為False,其余則映射為T(mén)rue。從輸出結(jié)果看出,索引0對(duì)應(yīng)的數(shù)據(jù)為T(mén)rue,說(shuō)明沒(méi)有出現(xiàn)空值或缺失值,索引1和2對(duì)應(yīng)的數(shù)據(jù)為False,說(shuō)明出現(xiàn)了空值或缺失值。
3. dropna()方法
dropna()方法的作用是刪除含有空值或缺失值的行或列,其語(yǔ)法格式如下:
dropna(axis=0, how='any', thresh=None, subset=None, inplace=False)
上述方法中部分參數(shù)表示的含義如下:
(1) axis:確定過(guò)濾行或列,取值可以為:
0或index:刪除包含缺失值的行,默認(rèn)為0。
1或columns:刪除包含缺失值的列。
(2) how:確定過(guò)濾的標(biāo)準(zhǔn),取值可以為:
any:默認(rèn)值。如果存在NaN值,則刪除該行或該列。
all:如果所有值都是NaN值,則刪除該行或該列。
(3) thresh:c表示有效數(shù)據(jù)量的最小要求。若傳入了2,則是要求該行或該列至少有兩個(gè)非NaN值時(shí)將其保留。
(4) subset:表示在特定的子集中尋找NaN值。
(5) inplace:表示是否在原數(shù)據(jù)上操作。如果設(shè)為T(mén)rue,則表示直接修改原數(shù)據(jù);如果設(shè)為False,則表示修改原數(shù)據(jù)的副本,返回新的數(shù)據(jù)。
假設(shè),現(xiàn)在有一張關(guān)于書(shū)籍信息的表格,它里面有類別、書(shū)名和作者三列數(shù)據(jù)。其中,在索引為0的一行中書(shū)名為NaN,表明該位置的數(shù)據(jù)是缺失值,索引為1的一行中作者為None,表明該位置的數(shù)據(jù)是空值。如果刪除這些空值和缺失值,那么刪除前后的效果如圖1所示。
圖1 刪除空值/缺失值前后的表格
接下來(lái),通過(guò)一個(gè)示例來(lái)演示如何使用dropna()方法刪除空值和缺失值,具體代碼如下。
In [3]: import pandas as pd import numpy as np df_obj = pd.DataFrame({"類別":['小說(shuō)', '散文隨筆', '青春文學(xué)', '傳記'], "書(shū)名":[np.nan, '《皮囊》', '《旅程結(jié)束時(shí)》', '《老舍自傳》'], "作者":["老舍", None, "張其鑫", "老舍"]}) df_obj Out[3]: 類別 書(shū)名 作者 0 小說(shuō) NaN 老舍 1 散文隨筆 《皮囊》 None 2 青春文學(xué) 《旅程結(jié)束時(shí)》 張其鑫 3 傳記 《老舍自傳》 老舍 In [4]: df_obj.dropna() # 刪除數(shù)據(jù)集中的空值和缺失值 Out[4]: 類別 書(shū)名 作者 2 青春文學(xué) 《旅程結(jié)束時(shí)》 張其鑫 3 傳記 《老舍自傳》 老舍
上述代碼中,首先創(chuàng)建一個(gè)含有空值和缺失值的DataFrame對(duì)象,再讓該對(duì)象調(diào)用dropna()方法將數(shù)據(jù)中的空值或缺失值進(jìn)行過(guò)濾刪除,只保留完整的數(shù)據(jù)。
從輸出結(jié)果看出,所有包含空值或缺失值的行已經(jīng)被刪除了。
4. 填充空值/缺失值
填充缺失值和空值的方式有很多種,比如人工填寫(xiě)、特殊值填寫(xiě)、熱卡填充等。Pandas中的fillna()方法可以實(shí)現(xiàn)填充空值或缺失值,其語(yǔ)法格式如下:
fillna(value=None, method=None, axis=None, inplace=False,limit=None, downcast=None, **kwargs)
上述方法中部分參數(shù)表示的含義如下:
(1) value:用于填充的數(shù)值。
(2) method:表示填充方式,默認(rèn)值為None,另外還支持以下取值:
pad/ffill:將最后一個(gè)有效的數(shù)據(jù)向后傳播,也就是說(shuō)用缺失值前面的一個(gè)值代替缺失值。
backfill/bfill:將最后一個(gè)有效的數(shù)據(jù)向前傳播,也就是說(shuō)用缺失值后面的一個(gè)值代替缺失值。
(3) limit: 可以連續(xù)填充的最大數(shù)量,默認(rèn)None。
注意:
method參數(shù)不能與value參數(shù)同時(shí)使用。
當(dāng)使用fillna()方法進(jìn)行填充時(shí),既可以是標(biāo)量、字典,也可以是Series或DataFrame對(duì)象。
假設(shè)現(xiàn)在有一張表格,它里面存在一些缺失值,如果使用一個(gè)常量66.0來(lái)替換缺失值,那么填充前后的效果如圖2所示。
圖2 填充缺失值示例
填充常數(shù)替換缺失值的示例代碼如下。
In [5]: import pandas as pd import numpy as np from numpy import NaN df_obj = pd.DataFrame({'A': [1, 2, 3, NaN], 'B': [NaN, 4, NaN, 6], 'C': ['a', 7, 8, 9], 'D':[ NaN, 2, 3, NaN]}) df_obj Out[5]: A B C D 0 1.0 NaN a NaN 1 2.0 4.0 7 2.0 2 3.0 NaN 8 3.0 3 NaN 6.0 9 NaN In [6]: df_obj.fillna('66.0') # 使用66.0替換缺失值 Out[6]: A B C D 0 1.0 66.0 a 66.0 1 2.0 4.0 7 2.0 2 3.0 66.0 8 3.0 3 66.0 6.0 9 66.0
通過(guò)比較兩次的結(jié)果可知,當(dāng)使用任意一個(gè)有效值替換空值或缺失值時(shí),對(duì)象中所有的空值或缺失值都將會(huì)被替換。
如果希望填充不一樣的內(nèi)容,例如,A列缺失的數(shù)據(jù)使用數(shù)字“4.0”進(jìn)行填充,B列缺失的數(shù)據(jù)使用數(shù)字“5.0”來(lái)填充,那么填充前后的效果如圖3所示。
圖3 指定填充列
調(diào)用fillna()方法時(shí)傳入一個(gè)字典給value參數(shù),其中字典的鍵為列標(biāo)簽,字典的值為待替換的值,實(shí)現(xiàn)對(duì)指定列的缺失值進(jìn)行替換,具體示例代碼如下。
In [7]: import pandas as pd import numpy as np from numpy import NaN df_obj = pd.DataFrame({'A': [1, 2, 3, NaN], 'B': [NaN, 4, NaN, 6], 'C': ['a', 7, 8, 9], 'D': [NaN, 2, 3, NaN]}) df_obj Out[7]: A B C D 0 1.0 NaN a NaN 1 2.0 4.0 7 2.0 2 3.0 NaN 8 3.0 3 NaN 6.0 9 NaN In [8]: df_obj.fillna({'A': 4.0, 'B': 5.0}) # 指定列填充數(shù)據(jù) Out[8]: A B C D 0 1.0 5.0 a NaN 1 2.0 4.0 7 2.0 2 3.0 5.0 8 3.0 3 4.0 6.0 9 NaN
如果希望填充相鄰的數(shù)據(jù)來(lái)替換缺失值,例如,A~D列中按從前往后的順序填充缺失的數(shù)據(jù),也就是說(shuō)在當(dāng)前列中使用位于缺失值前面的數(shù)據(jù)進(jìn)行替換,填充前后的效果如圖4所示。
圖4 前向填充示例
調(diào)用fillna()方法時(shí)將“ffill”傳入給method參數(shù),實(shí)現(xiàn)前向填充缺失的數(shù)據(jù),具體示例代碼如下。
In [9]: import pandas as pd import numpy as np from numpy import NaN df = pd.DataFrame({'A': [1, 2, 3, None], 'B': [NaN, 4, None, 6], 'C': ['a', 7, 8, 9], 'D': [None, 2, 3, NaN]}) df Out[9]: A B C D 0 1.0 NaN a NaN 1 2.0 4.0 7 2.0 2 3.0 NaN 8 3.0 3 NaN 6.0 9 NaN In [10]: df.fillna(method='ffill') # 使用前向填充的方式替換空值或缺失值 Out[10]: A B C D 0 1.0 NaN a NaN 1 2.0 4.0 7 2.0 2 3.0 4.0 8 3.0
猜你喜歡:
Python中常用的數(shù)據(jù)分析工具(模塊)有哪些?
Python做數(shù)據(jù)分析有哪些優(yōu)勢(shì)?
北京校區(qū)