1. 程式人生 > 其它 >資料處理 - 處理缺失值

資料處理 - 處理缺失值

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
"""

總結

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