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