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

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

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

1577370495235_學IT就到黑馬程序員.gif

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

數(shù)據(jù)清洗是一項復雜且繁瑣的工作,同時也是整個數(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ù)清洗操作有空值和缺失值的處理、重復值的處理、異常值的處理、統(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對應的數(shù)據(jù)為True,說明沒有出現(xiàn)空值或缺失值,索引1和2對應的數(shù)據(jù)為False,說明出現(xiàn)了空值或缺失值。

3. dropna()方法

dropna()方法的作用是刪除含有空值或缺失值的行或列,其語法格式如下:

dropna(axis=0, how='any', thresh=None, subset=None, inplace=False)

上述方法中部分參數(shù)表示的含義如下:

(1) axis:確定過濾行或列,取值可以為:

0或index:刪除包含缺失值的行,默認為0。

1或columns:刪除包含缺失值的列。

(2) how:確定過濾的標準,取值可以為:

any:默認值。如果存在NaN值,則刪除該行或該列。

all:如果所有值都是NaN值,則刪除該行或該列。

(3) thresh:c表示有效數(shù)據(jù)量的最小要求。若傳入了2,則是要求該行或該列至少有兩個非NaN值時將其保留。

(4) subset:表示在特定的子集中尋找NaN值。

(5) inplace:表示是否在原數(shù)據(jù)上操作。如果設為True,則表示直接修改原數(shù)據(jù);如果設為False,則表示修改原數(shù)據(jù)的副本,返回新的數(shù)據(jù)。

假設,現(xiàn)在有一張關(guān)于書籍信息的表格,它里面有類別、書名和作者三列數(shù)據(jù)。其中,在索引為0的一行中書名為NaN,表明該位置的數(shù)據(jù)是缺失值,索引為1的一行中作者為None,表明該位置的數(shù)據(jù)是空值。如果刪除這些空值和缺失值,那么刪除前后的效果如圖1所示。

1610957573977_11.png

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

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

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

Out[3]:      類別       書名         作者
        0    小說       NaN          老舍
        1  散文隨筆     《皮囊》       None
        2  青春文學     《旅程結(jié)束時》  張其鑫
        3    傳記      《老舍自傳》    老舍
In [4]: df_obj.dropna()   # 刪除數(shù)據(jù)集中的空值和缺失值
Out[4]:
            類別       書名    作者
        2  青春文學  《旅程結(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:表示填充方式,默認值為None,另外還支持以下取值:

pad/ffill:將最后一個有效的數(shù)據(jù)向后傳播,也就是說用缺失值前面的一個值代替缺失值。

backfill/bfill:將最后一個有效的數(shù)據(jù)向前傳播,也就是說用缺失值后面的一個值代替缺失值。

(3) limit: 可以連續(xù)填充的最大數(shù)量,默認None。

注意:

method參數(shù)不能與value參數(shù)同時使用。

當使用fillna()方法進行填充時,既可以是標量、字典,也可以是Series或DataFrame對象。

假設現(xiàn)在有一張表格,它里面存在一些缺失值,如果使用一個常量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é)果可知,當使用任意一個有效值替換空值或缺失值時,對象中所有的空值或缺失值都將會被替換。

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

1610957597724_13.png

圖3 指定填充列

調(diào)用fillna()方法時傳入一個字典給value參數(shù),其中字典的鍵為列標簽,字典的值為待替換的值,實現(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ù),也就是說在當前列中使用位于缺失值前面的數(shù)據(jù)進行替換,填充前后的效果如圖4所示。

1610957613047_14.png

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

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

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

黑馬Python培訓課程

分享到:
在線咨詢 我要報名
和我們在線交談!