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