原文链接:风一带你一起学习:数据清洗_缺失值处理
碎碎念念:大家好!我是风一、有人调侃做数据的、80%的时间都是花在数据清洗上、虽然有时很想反驳一下、但现实确实经常是如此,那么何为数据清洗?需要处理的数据主要又有哪些?那么就让我们开始吧!
所谓的清洗,是对数据集通过丢弃、填充、替换、去重等操作,达到去除异常、纠正错误、补足缺失的目的;在数据清洗的过程中、主要需要处理的有缺失值、异常值和重复值,以下篇幅为数据缺失值处理。
一种是行记录的缺失,这种情况又称为数据记录的丢失;另一种是数据列值的缺失,即由于各种原因导致的数据记录中某些列的值空缺 。
缺失的数据记录通常都是无法找回的、那么针对数据列类型的缺失值数据、需如何处理?
直接丢弃:也就是删除带有缺失值的行记录(整行删除)或者列字段 (整列删除),通过直接删除这种方法非常简单明了、处理起来也特别的方便,但删除就意味着会消减数据的维度、特征;尤其是存在大量的缺失值 或者 带有缺失值的数据记录存在着明显的数据分布规律或特征,这些场景下都不宜直接丢弃缺失值。
补全缺失值:相比直接删除而言、补全是更常用的缺失值处理方法。通过统计值(均值、中位数等)、预测值、专家补全等方法将缺失的数据补全、使数据达成一个完整的数据结构、对于后续的数据处理、分析和建模至关重要。
真值转化法:在很多场景中、是无法得知缺失值的分布规律,并且无法直接对缺失值做补全删除等处理;那么我们认为数据缺失也是一种规律,去承认缺失值的存在,比如用户性别字段、部分数据的性别是不全的,但又不能直接丢弃或者补全、那么就可以将其中的值分布状态转换为多个变量的真值状态(转换前:一个字段(值为 男、女、未知); 转换后:多个字段 、男 (1 或 0)、 女 (1 或 0)、 未知 (1 或 0) )。
不做任何处理:一般而言、这类缺失值不涉及到业务所比较关键的字段 或者不影响到后期的数据分析和建模应用,很多模型对于缺失值有容忍度或灵活的处理方法,比如:KNN、决策树等等。
在缺失值的处理上、主要配合使用 sklearn.preprocessing 中 的 Imputer 类、Pandas 和 Numpy。
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
图片
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
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
图
# 官网地址: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参数:
图片:
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)