首頁技術(shù)文章正文

為什么要進(jìn)行Pandas數(shù)據(jù)預(yù)處理?代碼操作示例

更新時(shí)間:2021-01-18 來源:黑馬程序員 瀏覽量:

1577370495235_學(xué)IT就到黑馬程序員.gif

前期采集到的數(shù)據(jù),或多或少都存在一些瑕疵和不足,比如數(shù)據(jù)缺失、極端值、數(shù)據(jù)格式不統(tǒng)一等問題。因此,在分析數(shù)據(jù)之前需要對(duì)數(shù)據(jù)進(jìn)行預(yù)處理,包括數(shù)據(jù)的清洗、合并、重塑與轉(zhuǎn)換。Pandas中專門提供了用于數(shù)據(jù)預(yù)處理的很多函數(shù)與方法,用于替換異常數(shù)據(jù)、合并數(shù)據(jù)、重塑數(shù)據(jù)等。

數(shù)據(jù)清洗是一項(xiàng)復(fù)雜且繁瑣的工作,同時(shí)也是整個(gè)數(shù)據(jù)分析過程中最為重要的環(huán)節(jié)。數(shù)據(jù)清洗的目的在于提高數(shù)據(jù)質(zhì)量,將臟數(shù)據(jù)(臟數(shù)據(jù)在這里指的是對(duì)數(shù)據(jù)分析沒有實(shí)際意義、格式非法、不在指定范圍內(nèi)的數(shù)據(jù))清洗干凈,使原數(shù)據(jù)具有完整性、唯一性、權(quán)威性、合法性、一致性等特點(diǎn)。Pandas中常見的數(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)行刪除和填充,下面來一一介紹。

1. isnull()函數(shù)

isnull()函數(shù)的語法格式如下:

pandas.isnull(obj)

上述函數(shù)中只有一個(gè)參數(shù)obj,表示檢查空值的對(duì)象,該函數(shù)會(huì)返回一個(gè)布爾類型的值,如果返回的結(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)建了一個(gè)Series對(duì)象,該對(duì)象中包含1、None和NaN三個(gè)值,然后調(diào)用isnull()函數(shù)檢查Series對(duì)象中的數(shù)據(jù),數(shù)據(jù)為空值或缺失值就映射為True,其余值就映射為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

上述示例中,通過notnull()函數(shù)來檢查空值或缺失值,只要出現(xiàn)空值或缺失值就映射為False,其余則映射為True。從輸出結(jié)果看出,索引0對(duì)應(yīng)的數(shù)據(jù)為True,說明沒有出現(xiàn)空值或缺失值,索引1和2對(duì)應(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,則是要求該行或該列至少有兩個(gè)非NaN值時(shí)將其保留。

(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所示。

1610957573977_11.png

圖1 刪除空值/缺失值前后的表格

接下來,通過一個(gè)示例來演示如何使用dropna()方法刪除空值和缺失值,具體代碼如下。

In [3]: import pandas as pd
        import numpy as np
        df_obj = pd.DataFrame({"類別":['小說', '散文隨筆', '青春文學(xué)', '傳記'],
                               "書名":[np.nan, '《皮囊》', '《旅程結(jié)束時(shí)》', '《老舍自傳》'],
                               "作者":["老舍", None, "張其鑫", "老舍"]})
        df_obj

Out[3]:      類別       書名         作者
        0    小說       NaN          老舍
        1  散文隨筆     《皮囊》       None
        2  青春文學(xué)     《旅程結(jié)束時(shí)》  張其鑫
        3    傳記      《老舍自傳》    老舍
In [4]: df_obj.dropna()   # 刪除數(shù)據(jù)集中的空值和缺失值
Out[4]:
            類別       書名    作者
        2  青春文學(xué)  《旅程結(jié)束時(shí)》  張其鑫
        3    傳記   《老舍自傳》   老舍

上述代碼中,首先創(chuàng)建一個(gè)含有空值和缺失值的DataFrame對(duì)象,再讓該對(duì)象調(diào)用dropna()方法將數(shù)據(jù)中的空值或缺失值進(jìn)行過濾刪除,只保留完整的數(shù)據(jù)。

從輸出結(jié)果看出,所有包含空值或缺失值的行已經(jīng)被刪除了。

4. 填充空值/缺失值

填充缺失值和空值的方式有很多種,比如人工填寫、特殊值填寫、熱卡填充等。Pandas中的fillna()方法可以實(shí)現(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:將最后一個(gè)有效的數(shù)據(jù)向后傳播,也就是說用缺失值前面的一個(gè)值代替缺失值。

backfill/bfill:將最后一個(gè)有效的數(shù)據(jù)向前傳播,也就是說用缺失值后面的一個(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來替換缺失值,那么填充前后的效果如圖2所示。

1610957586392_12.png

圖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)使用任意一個(gè)有效值替換空值或缺失值時(shí),對(duì)象中所有的空值或缺失值都將會(huì)被替換。

如果希望填充不一樣的內(nèi)容,例如,A列缺失的數(shù)據(jù)使用數(shù)字“4.0”進(jìn)行填充,B列缺失的數(shù)據(jù)使用數(shù)字“5.0”來填充,那么填充前后的效果如圖3所示。

1610957597724_13.png

圖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ù)來替換缺失值,例如,A~D列中按從前往后的順序填充缺失的數(shù)據(jù),也就是說在當(dāng)前列中使用位于缺失值前面的數(shù)據(jù)進(jìn)行替換,填充前后的效果如圖4所示。

1610957613047_14.png

圖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庫pandas使用的5種技巧

Python中有幾種數(shù)據(jù)類型?數(shù)據(jù)類型簡單介紹

python爬蟲用什么數(shù)據(jù)庫好?Mysql和Mongdb哪家有優(yōu)勢(shì)?

黑馬Python培訓(xùn)課程

分享到:
在線咨詢 我要報(bào)名
和我們?cè)诰€交談!