数据清洗_缺失值处理

原文链接:风一带你一起学习:数据清洗_缺失值处理

碎碎念念:大家好!我是风一、有人调侃做数据的、80%的时间都是花在数据清洗上、虽然有时很想反驳一下、但现实确实经常是如此,那么何为数据清洗?需要处理的数据主要又有哪些?那么就让我们开始吧!

所谓的清洗,是对数据集通过丢弃、填充、替换、去重等操作,达到去除异常、纠正错误、补足缺失的目的;在数据清洗的过程中、主要需要处理的有缺失值、异常值和重复值,以下篇幅为数据缺失值处理。

一、数据缺失的两种情况:

一种是行记录的缺失,这种情况又称为数据记录的丢失;另一种是数据列值的缺失,即由于各种原因导致的数据记录中某些列的值空缺 。

二、数据缺失的常用处理思路

缺失的数据记录通常都是无法找回的、那么针对数据列类型的缺失值数据、需如何处理?

  • 直接丢弃:也就是删除带有缺失值的行记录(整行删除)或者列字段 (整列删除),通过直接删除这种方法非常简单明了、处理起来也特别的方便,但删除就意味着会消减数据的维度、特征;尤其是存在大量的缺失值 或者 带有缺失值的数据记录存在着明显的数据分布规律或特征,这些场景下都不宜直接丢弃缺失值。

  • 补全缺失值:相比直接删除而言、补全是更常用的缺失值处理方法。通过统计值(均值、中位数等)、预测值、专家补全等方法将缺失的数据补全、使数据达成一个完整的数据结构、对于后续的数据处理、分析和建模至关重要。

  • 真值转化法:在很多场景中、是无法得知缺失值的分布规律,并且无法直接对缺失值做补全删除等处理;那么我们认为数据缺失也是一种规律,去承认缺失值的存在,比如用户性别字段、部分数据的性别是不全的,但又不能直接丢弃或者补全、那么就可以将其中的值分布状态转换为多个变量的真值状态(转换前:一个字段(值为 男、女、未知); 转换后:多个字段 、男 (1 或 0)、 女 (1 或 0)、 未知 (1 或 0) )。

  • 不做任何处理:一般而言、这类缺失值不涉及到业务所比较关键的字段 或者不影响到后期的数据分析和建模应用,很多模型对于缺失值有容忍度或灵活的处理方法,比如:KNN、决策树等等。

三、代码实练

在缺失值的处理上、主要配合使用 sklearn.preprocessing 中 的 Imputer 类、Pandas 和 Numpy。

3.1.导入所需库并生成缺失数据

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

图片

3.2.判断缺失值

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

3.3.丢弃缺失值

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

3.4.通过 sklearn 的数据预处理方法对缺失值进行处理

# 官网地址: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参数:

图片:

3.5.使用 Pandas 做缺失值处理

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)

你可能感兴趣的:(python,数据治理,python,数据分析)