数据清洗:缺失值识别和处理方法

缺失值识别

数据缺失分为两种:一是行记录的缺失;二是列值的缺失。

不同的数据存储和环境中对于缺失值的表示不同,例如数据库中是Null、Python返回对象是None、Pandas或Numpy中是NaN。

构造数据:

#导入相关库
import pandas as pd
import numpy as np

生成缺失数据
df = pd.DataFrame(np.random.randn(6, 4),
                  columns=['col1', 'col2', 'col3', 'col4'])
df.iloc[:, 1] = np.nan
df.iloc[4, 3] = np.nan
print(df)

数据清洗:缺失值识别和处理方法

查看缺失值:

查看哪些值缺失,缺失值返回True
nan_all = df.isnull()
print(nan_all)
print()
查看哪些列缺失
nan_col1 = df.isnull().any()  # 含有NA的列返回True
nan_col2 = df.isnull().all()  # 全部为NA的列返回True
print(nan_col1)
print(nan_col2)
print()
查看哪些行缺失
nan_row1 = df.isnull().any(axis=1)  # 含有NA的行返回True
nan_row2 = df.isnull().all(axis=1)  # 全部为NA的行返回True
print(nan_row1)
print(nan_row2)
print()

数据清洗:缺失值识别和处理方法
查看每列缺失值个数
print(df.isnull().sum())
查看每列未缺失值个数,等价于df.count()
print(df.notnull().sum())

数据清洗:缺失值识别和处理方法

缺失值处理方式

通常有四种思路:

1.丢弃

直接丢弃带有缺失值的行记录(整行删除)或者列字段(整列删除)。优点:方法简单明了,减少缺失数据对总体数据的影响。缺点:会消减数据特征。

以下任意一种场景都不宜丢弃缺失值:

  • 数据集总体中存在大量的数据记录不完整情况且比例较大,例如超过10%,删除这些带有缺失值的记录意味着将会损失过多有用信息。
  • 带有缺失值的数据记录存在着明显的数据分布规律或特征,例如带有缺失值的数据记录的目标标签主要集中于某一类或几类,如果删除这些数据记录将使对应分类的数据样本丢失大量特征信息,导致模型过拟合或分类不准确。
丢弃缺失值
print(df.dropna())            # 直接丢弃含有NA的行记录,默认axis=0,how='any'
print(df.dropna(how='all'))   # 直接丢弃全部值为NA的行记录
print(df.dropna(axis=1))             # 直接丢弃含有NA的列记录
print(df.dropna(axis=1,how='all'))   # 直接丢弃全部值为NA的列记录

数据清洗:缺失值识别和处理方法

2.补全

相对丢弃而言,补全是更加常用的缺失值处理方式,通过一定的方法将缺失的数据补上,从而形成完整的数据记录,对于后续的数据处理、分析和建模至关重要。

常用的补全方法包括:

  • 统计法:对于数值型的数据,使用均值、加权均值、中位数等方法补足;对于分类型数据,使用众数等方法补足。
  • 模型法:可以基于已有的其他字段,将缺失字段作为目标变量进行预测,从而得到较为可能的补全值。如果带有缺失值的列是数值变量,采用回归模型补全;如果是分类变量,则采用分类模型补全。
  • 专家补全:对于少量且具有重要意义的数据记录,专家补足也是非常重要的一种途径。
  • 其他方法:例如随机法、特殊值法、多重填补等。
引入sklearn包
from sklearn.impute import SimpleImputer
建立模型规则:strategy默认mean,也可设置为median或most_frequent
nan_model = SimpleImputer(missing_values=np.nan, strategy='mean')
nan_result = nan_model.fit_transform(df)
print(nan_result)

#由于col2列全部为nan值,无法应用模型规则,col4列缺失值可以应用模型规则

数据清洗:缺失值识别和处理方法
使用pandas替换缺失值

用后面的值替换缺失值,或者用bfill
print(df.fillna(method='backfill'))
用后面的值替代缺失值,限制每列只能替代一个缺失值
print(df.fillna(method='backfill', limit=1))
用前面的值替换缺失值,或者用ffill
print(df.fillna(method='pad'))

用特定值替换缺失值,比如0,也可直接使用df.replace(np.nan,0)
print(df.fillna(0))
fillna函数传入字典,用不同值替换不同列的缺失值
print(df.fillna({'col2': 1.1, 'col4': 1.2}))
用平均数mean代替,选择各自列的均值替换缺失值,也可用中位数median或众数mode
print(df.fillna(df.mean()))

插值填充,默认线性填充
print(df.interpolate())

3.真值转换法

某些情况下,我们可能无法得知缺失值的分布规律,并且对于缺失值无法采用上述任何一种方法做处理;或者我们认为数据缺失也是一种规律,不应该轻易对缺失值随意处理,那么还有一种缺失值处理思路——真值转换。

数据缺失也是数据分布规律的一部分,将变量的实际值和缺失值都作为输入维度参与后续数据处理和模型计算中,然而缺失值通常无法参与直接运算,因此需要将缺失值进行真值转换。

4.不处理

在数据预处理阶段,对于具有缺失值的数据记录不作任何处理,也是一种思路。很多模型对于缺失值有容忍度或灵活的处理方法,因此在预处理阶段可以不做处理。

常见的能够自动处理缺失值的模型包括:KNN、决策树和随机森林、神经网络和朴素贝叶斯、DBSCAN等。这些模型对于缺失值的处理思路是:

  • 忽略,缺失值不参与距离计算,例如KNN。
  • 将缺失值作为分布的一种状态,并参与到建模过程,例如各种决策树及其变体。
  • 不基于距离做计算,因此基于值的距离计算,本身的影响就消除了,例如DBSCAN。

说明:在数据建模前的特征选择阶段,假如我们通过一定方法确定带有缺失值的字段对于模型的影响非常小,那么我们根本就不需要对缺失值进行处理。因此,后期建模时的字段或特征的重要性判断也是决定是否处理字段缺失值的重要参考因素之一。

参考资料:《Python数据分析与数据化运营》宋天龙

Original: https://blog.csdn.net/sinat_41928169/article/details/124417344
Author: 大哇唧
Title: 数据清洗:缺失值识别和处理方法

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/751895/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 用户输入和while循环

    第6节.用户输入和while循环 6.1函数input() 简单的输入 massage=input("Tell me something,and I will repea…

    Python 2023年6月3日
    054
  • SQL语言概述

    SQL语言概述 (一)SQL语言介绍 SQL(Structured Query Language) 是 结构化查询语言的缩写,使用SQL和DBMS进行交互,操纵关系型数据库中的资源…

    Python 2023年6月3日
    071
  • numpy(五)函数篇

    身为一个库,就必然有它封装的函数,这一节我们将学习numpy中的函数。 2.1 数学函数 数学函数比较简单,只需简单的看一下即可,这儿不给例子。 函数名作用参数解读np.sin(x…

    Python 2023年8月26日
    051
  • MongoDB Node 驱动使用指南

    MongoDB Node 驱动介绍 1. MongoDB数据库连接指南 使用原生的 mongodb Node驱动连接MongoDB数据库。 1.1 数据库连接URI 数据库连接UR…

    Python 2023年10月27日
    037
  • 字符个数统计-python

    题目描述 编写一个函数,计算字符串中含有的不同字符的个数。字符在 ASCII 码范围内( 0~127 ,包括 0 和 127 ),换行表示结束符,不算在字符里。不在范围内的不作统计…

    Python 2023年6月12日
    076
  • Python代码阅读(第47篇):从列表右边开始执行给定函数

    本篇阅读的代码实现了将给定的函数倒序依次应用在列表元素上的功能。 本篇阅读的代码片段来自于30-seconds-of-python。 Python 代码阅读合集介绍:为什么不推荐P…

    Python 2023年6月15日
    067
  • 2021-09-30 Backtesting.py 恒生指数

    主要是使用backtesting.py做了个回测,对象是恒生指数,数据源是yahoo finance,策略是基于夏普率的Z-score 配合给定阈值,然后目标是计算9格平均夏普率的…

    Python 2023年8月22日
    027
  • python selenium 如何选中iframe中的元素?

    IFRAME是​​HTML​​标签,作用是文档中的文档,或者浮动的框架(FRAME)。iframe元素会创建包含另外一个文档的内联框架(即行内框架)。 目录 ​​1、分析网页源代码…

    Python 2023年5月25日
    097
  • python mean dropna_Python Pandas 清理空(NULL)单元格

    1、空单元格 分析数据时,空单元格可能会给带来错误的结果。 2、删除行 处理空单元格的一种方法是删除包含空单元格的行。 这通常是可以的,因为数据集可能非常大,并且删除几行不会对结果…

    Python 2023年8月16日
    047
  • Pytest框架与应用

    2.9.1 PO设计模式 在说Pytest之前,我们先来看一下什么是 PO(Page Object)设计模式。为什么要引用PO设计模式?PO提供了一种业务流程与页面元素操作分离的模…

    Python 2023年9月10日
    040
  • 【爬虫】scrapy爬虫框架

    欢迎来到老胡的算法解题思路,本文章主要使用的语言为python,使用的框架为scrapy,基于这一篇文章,我将为你介绍scrapy的基本操作,以及实际应用,喜欢的朋友可以关注一下,…

    Python 2023年10月1日
    046
  • 自动化办公:手机号码提取器,使用正则表达式轻松提取文本文件中的手机号码

    关于手机号码的提取,其实真正有用的部分就是re模块提供的正则表达式。使用正则表达式就能轻松地匹配到手机号码,由于功能比较简单这次并没有采用UI界面的方式来实现该功能。 【阅读全文】…

    Python 2023年5月24日
    057
  • 使用Python发送、订阅消息

    使用Python发送、订阅消息 使用插件 paho-mqtt Paho 是一个开源的 MQTT 客户端项目,提供多种语言的 MQTT 客户端实现,包括 C、C++、C#、Java、…

    Python 2023年5月25日
    085
  • 自底向上:从可变对象、不可变对象到深浅拷贝再到数据结构

    不可变对象和可变对象 [En] Immutable objects and mutable objects * * Python 在 heap 中分配的对象分成两类:可变对象和不可…

    Python 2023年5月24日
    069
  • 【NLP】文本情感分析

    昨晚太晚代码还没有跑完,恰巧又遇到PSO-LSTM的准确率没办法复原,惨兮兮/(ㄒoㄒ)/,具体内容今天来补上 文本情感分析 * – 一、情感分析简介 – …

    Python 2023年8月1日
    050
  • python 实现二叉树

    本文不涉及二叉树概念的详细讲解,而着重利用 python 实现 二叉树,其中穿插代码讲解。 在链表中,一个节点只能有一个后继节点和前驱节点。而在 中,一个节点可以有多个后继节点,但…

    Python 2023年8月2日
    032
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球