天天看點

資料清洗_缺失值處理

原文連結:風一帶你一起學習:資料清洗_缺失值處理

碎碎念念:大家好!我是風一、有人調侃做資料的、80%的時間都是花在資料清洗上、雖然有時很想反駁一下、但現實确實經常是如此,那麼何為資料清洗?需要處理的資料主要又有哪些?那麼就讓我們開始吧!

所謂的清洗,是對資料集通過丢棄、填充、替換、去重等操作,達到去除異常、糾正錯誤、補足缺失的目的;在資料清洗的過程中、主要需要處理的有缺失值、異常值和重複值,以下篇幅為資料缺失值處理。

一、資料缺失的兩種情況:

一種是行記錄的缺失,這種情況又稱為資料記錄的丢失;另一種是資料列值的缺失,即由于各種原因導緻的資料記錄中某些列的值空缺 。

二、資料缺失的常用處理思路

缺失的資料記錄通常都是無法找回的、那麼針對資料列類型的缺失值資料、需如何處理?

  • 直接丢棄:也就是删除帶有缺失值的行記錄(整行删除)或者列字段 (整列删除),通過直接删除這種方法非常簡單明了、處理起來也特别的友善,但删除就意味着會消減資料的次元、特征;尤其是存在大量的缺失值 或者 帶有缺失值的資料記錄存在着明顯的資料分布規律或特征,這些場景下都不宜直接丢棄缺失值。
  • 補全缺失值:相比直接删除而言、補全是更常用的缺失值處理方法。通過統計值(均值、中位數等)、預測值、專家補全等方法将缺失的資料補全、使資料達成一個完整的資料結構、對于後續的資料處理、分析和模組化至關重要。
  • 真值轉化法:在很多場景中、是無法得知缺失值的分布規律,并且無法直接對缺失值做補全删除等處理;那麼我們認為資料缺失也是一種規律,去承認缺失值的存在,比如使用者性别字段、部分資料的性别是不全的,但又不能直接丢棄或者補全、那麼就可以将其中的值分布狀态轉換為多個變量的真值狀态(轉換前:一個字段(值為 男、女、未知); 轉換後:多個字段 、男 (1 或 0)、 女 (1 或 0)、 未知 (1 或 0) )。
  • 不做任何處理:一般而言、這類缺失值不涉及到業務所比較關鍵的字段 或者不影響到後期的資料分析和模組化應用,很多模型對于缺失值有容忍度或靈活的處理方法,比如:KNN、決策樹等等。

三、代碼實練

在缺失值的處理上、主要配合使用 sklearn.preprocessing 中 的 Imputer 類、Pandas 和 Numpy。

3.1.導入所需庫并生成缺失資料

import pandas as pd
import numpy as np
# from sklearn.preprocessing import Imputer # 老版本

# Sklearn 專門處理缺失值的子產品、官網位址:https://www.jianshu.com/p/2c59147e1df1
from sklearn.impute import SimpleImputer as Imputer
           
df = pd.DataFrame(np.random.randn(6, 4), columns = ['col1', 'col2', 'col3', 'col4'])
df.iloc[1:2, 1] = np.nan
df.iloc[4, 3] = np.nan

df
           

圖檔

3.2.判斷缺失值

nan_all = df.isnull()  # 擷取所有資料框中的 N 值(N值為 Trure)
print(nan_all)
print('*'*30)

col_all = df.isnull().sum()  # 統計每列缺失值的數量
print(col_all)
print('*'*30)

nan_col1 = df.isnull().all() # 獲得全部為 NA 的列
print(nan_col1)
print('*'*30)

nan_col2 = df.isnull().any() # 獲得含有 NA 的列
print(nan_col2)
           
col1   col2   col3   col4
0  False  False  False  False
1  False   True  False  False
2  False  False  False  False
3  False  False  False  False
4  False  False  False   True
5  False  False  False  False
******************************
col1    0
col2    1
col3    0
col4    1
dtype: int64
******************************
col1    False
col2    False
col3    False
col4    False
dtype: bool
******************************
col1    False
col2     True
col3    False
col4     True
dtype: bool
           

3.3.丢棄缺失值

df2 = df.dropna(how = "any")   # 直接删除含有 NA 的行記錄
print(df2)
print('*'*30)

df3 = df.copy()
df3.iloc[1:2,:] = np.nan  # 将第二行都設定為 NA
df3 = df3.dropna(how = "all")  # 删除全部為 NA 值的行記錄
print(df3)
           
col1      col2      col3      col4
0 -0.530849 -0.587055  0.754068  0.597813
2  0.146497  0.625747 -1.663007 -1.356476
3 -0.699932  0.390106  1.342162 -2.133165
5 -0.549286 -0.300173  1.889540  1.178008
******************************
       col1      col2      col3      col4
0 -0.530849 -0.587055  0.754068  0.597813
2  0.146497  0.625747 -1.663007 -1.356476
3 -0.699932  0.390106  1.342162 -2.133165
4 -0.395517 -0.172803  0.233490       NaN
5 -0.549286 -0.300173  1.889540  1.178008
           
df
           

3.4.通過 sklearn 的資料預處理方法對缺失值進行處理

# 官網位址:https://scikit-learn.org/stable/modules/impute.html
nan_model = Imputer(missing_values = np.nan, strategy = 'mean') # 建立替換規則:将值為 NaN 的缺失值以均值做替換
nan_result = nan_model.fit_transform(df) 
print(nan_result)
           
[[-0.53084907 -0.58705498  0.75406835  0.59781252]
 [ 0.33872081 -0.00883559  2.19513579  1.79174735]
 [ 0.14649702  0.62574696 -1.66300695 -1.35647607]
 [-0.69993206  0.39010577  1.34216247 -2.13316465]
 [-0.39551654 -0.17280315  0.23349011  0.01558536]
 [-0.54928642 -0.30017256  1.88954049  1.17800765]]
           

注意事項:missing_values 預設空值 np.nan, 指定空值需 np.nan、直接寫 ‘NaN’ 是不一樣的、會報錯。

strategy參數:

圖檔:

3.5.使用 Pandas 做缺失值處理

Pandas 對缺失值的處理方法是 df.fillna(),該方法中最主要的兩個參數是 value 和 method。前者通過固定(或手動指定)的值替換缺失值,後者使用 pandas 提供預設方法替換缺失值。

''' DataFrame
def fillna(
        self,
        value=None, # 指定填充的值,可以是一個标量,或者字典等
        method=None, # 指定填充的方法; [pad/ffill、 backfill/bfill、 None]
        axis=None, # 指定軸
        inplace=False, # 是否将結果指派給原變量
        limit=None,  # 限制每列替換缺失值的個數
):

'''
           
nan_result_pd1 = df.fillna(method = 'backfill')  # 使用後面的值替換缺失值
nan_result_pd1
           
col1      col2      col3      col4
0 -0.530849 -0.587055  0.754068  0.597813
1  0.338721  0.625747  2.195136  1.791747
2  0.146497  0.625747 -1.663007 -1.356476
3 -0.699932  0.390106  1.342162 -2.133165
4 -0.395517 -0.172803  0.233490  1.178008
5 -0.549286 -0.300173  1.889540  1.178008
           

四、總結

在現實資料中、很容易出現缺失資料,尤其是資料次元特别大的情況下;那麼針對不同類型、不同的業務資料當然會有不同的方法;有些可以确認無效資料可以直接删除、但往往大部分都是無法直接這樣簡單明了處理、需結合實際業務以及資料結構進行處理、這裡風一就不一一展開詳解。

說明:文章大部分篇幅來源于宋老師(宋天龍)所著書籍《Python資料分析與資料化營運》的讀書筆記以及相應的學習擴充補充。

作者:在成長的風一
文章首發:公衆号【在成長的風一】
未經允許禁止轉載,需要轉載請微信聯系授權(微信号:Fy180920)