数据预处理 - 处理缺失值

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%以上,且重要性低,可以考虑删除变量;
  • 均值填充(变量分布比较均匀时);
  • 中位数填充(存在偏态分布时);
  • 众数填充(变量是离散变量时);
  • 模型预测填充:比如采用回归,随机森林等模型对缺失值进行预测,利用模型结果填充数据;
  • 哑变量填充(虚拟变量填充):用于离散数据的处理;
posted @ 2021-10-19 19:11  Rosaany  阅读(586)  评论(0编辑  收藏  举报