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