數據預處理 - 處理缺失值


1.處理缺失值方法

在pandas中,將缺失值稱為NA,意思是not available(不可用)

pandas在處理缺失值時,我們先了解相關函數介紹。

NA處理方法:

函數名 描述
dropna 根據每個標簽的值是否是缺失數據來篩選軸標簽,並根據允許丟失的數據量來確定閾值
fillna 用某些值填充缺少的數據或使用插值方法(如‘ffill’或'bfill')
isnull 返回表名哪些值是缺失值的布爾值
notnull isnull的反函數

2.過濾缺失值

過濾缺失值方法有很多種,可以使用pandas.dropna過濾缺失值。

先看一個例子,后續以下面張三李四等人考試成績為例說明,其中把缺失值(nan)當成缺考。

import pandas as pd
from numpy import nan

data = pd.DataFrame([['張三', 86, 74, 69, 70, 92],
                    ['李四', 61, 85, 68, 89, 93],
                    ['王五', 63, 91, 98, nan, 88],
                    ['小明', 77, None, nan, 82, 82], # None也會被當作NA處理
                    ['小王', nan, nan, nan, nan, nan]],
                    columns=['姓名', '語文', '數學', '歷史', '英語', '地理'])
print(data)
"""
   姓名    語文    數學    歷史    英語    地理
0  張三  86.0  74.0  69.0  70.0  92.0
1  李四  61.0  85.0  68.0  89.0  93.0
2  王五  63.0  91.0  98.0   NaN  88.0
3  小明  77.0   NaN   NaN  82.0  82.0
4  小王   NaN   NaN   NaN   NaN   NaN
"""
  • 過濾缺失值
##### 過濾至少一個NA的行 #####
print(data.dropna())
"""
    姓名    語文    數學    歷史    英語    地理
0  張三  86.0  74.0  69.0  70.0  92.0
1  李四  61.0  85.0  68.0  89.0  93.0
"""

##### 指定哪些列過濾缺失值 #####
print(data.dropna(subset=['數學'])
"""
   姓名    語文    數學    歷史    英語    地理
0  張三  86.0  74.0  69.0  70.0  92.0
1  李四  61.0  85.0  68.0  89.0  93.0
2  王五  63.0  91.0  98.0   NaN  88.0
"""

3.探索缺失值

##### 查看空值 #####
print(data.isnull().sum())
"""
姓名    0
語文    1
數學    2
歷史    2
英語    2
地理    1
dtype: int64
"""

##### 取出所有有空值的記錄 #####
print(data[data.isnull().T.any()])
"""
   姓名    語文    數學    歷史    英語    地理
2  王五  63.0  91.0  98.0   NaN  88.0
3  小明  77.0   NaN   NaN  82.0  82.0
4  小王   NaN   NaN   NaN   NaN   Na
"""

4.補全缺失值

你有時候可能有很多種方式補全缺失值,而不是過濾缺失值,這里我以均值補全缺失值為例講解

##### 你可能最先想到有某個值(標量)補全,比如補全數字:60 #####
print(data.fillna(60))
"""
   姓名    語文    數學    歷史    英語    地理
0  張三  86.0  74.0  69.0  70.0  92.0
1  李四  61.0  85.0  68.0  89.0  93.0
2  王五  63.0  91.0  98.0  60.0  88.0
3  小明  77.0  60.0  60.0  82.0  82.0
4  小王  60.0  60.0  60.0  60.0  60.0
"""
##### 進一步以每一科成績的平均值作為填充值 #####
mean_dict = data.mean().to_dict()  	 # 拿到字典格式的每科成績的均值
data.fillna(mean_dict, inplace=True) # 均值作為填充值補全缺失值
data = data.applymap(lambda x: '%.2f' % x if isinstance(x, (float, int)) else x) # 為了輸出結果有意義,小數保留2位
print(data)
"""
   姓名     語文     數學     歷史     英語     地理
0  張三  86.00  74.00  69.00  70.00  92.00
1  李四  61.00  85.00  68.00  89.00  93.00
2  王五  63.00  91.00  98.00  80.33  88.00
3  小明  77.00  83.33  78.33  82.00  82.00
4  小王  71.75  83.33  78.33  80.33  88.75
"""

5.其它

​ 在調用fillna補全缺失值,不僅可以傳入常量值,可以傳入設定不同的填充之的字典。

總結

​ 在上面的例子我以均值作為填充,另外還提到了缺失值的刪除,但在實際中處理數據缺失值時,還有其它的處理方法,大概有如下這些:

  • 刪除:一般來說缺失值超過50%以上,且重要性低,可以考慮刪除變量;
  • 均值填充(變量分布比較均勻時);
  • 中位數填充(存在偏態分布時);
  • 眾數填充(變量是離散變量時);
  • 模型預測填充:比如采用回歸,隨機森林等模型對缺失值進行預測,利用模型結果填充數據;
  • 啞變量填充(虛擬變量填充):用於離散數據的處理;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM