数据清洗第1篇章 - 处理缺失值和重复值

数据清洗是数据分析过程中至关重要的一步,它确保数据的准确性、一致性和完整性。这不仅有助于提高分析结果的可靠性和有效性,还能为算法建模决策提供高质量的数据基础。在进行数据分析和建模的过程中,大量的时间花在数据准备上:加载、清理、转换和重新排列,这样的工作占用了工程师 80% 以上的时间。所以掌握常用的数据清洗方法,将帮助我们能更高效、更高质量完成数据清洗工作。

我们将从易到难来讲述数据清洗系列三篇章,本文为第一篇章:处理缺失值和重复值,我们将理论和实践结合,层层递进一步一步掌握缺失值和重复值的处理方法。

一、处理缺失值

缺失数据会在很多数据分析应用中出现,当清洗数据用于分析时,对缺失数据本身进行分析以确定数据收集问题或数据丢失导致的数据偏差通常很重要。

1、缺失值表示

对于数值型数据,pandas 使用浮点值 NaN(Not a Number)来表示缺失值,包括 numpy 中的 nan 值和 Python 内建的 None 值。

import pandas as pd
import numpy as npseries_data = pd.Series([1, np.nan, None, 4])
series_data# ----输出----
0    1.0
1    NaN
2    NaN
3    4.0
dtype: float64
2、过滤缺失值

Series 中使用 dropna 来过滤缺失值,它会返回 Series 中所有的非空数据及其索引值

import pandas as pd
import numpy as npseries_data = pd.Series([1, np.nan, None, 4])
series_data.dropna()# ----输出----
0    1.0
3    4.0
dtype: float64

Series 中使用 dropna 删除缺失值时,默认情况下会删除包含缺失值的行

import pandas as pd
import numpy as npseries_data = pd.Series([1, np.nan, None, 4])
series_data.dropna()# ----输出----
0    1.0
3    4.0
dtype: float64

DataFrame 中使用 dropna 删除缺失值时,默认情况下会删除包含缺失值的行

import pandas as pd
import numpy as npframe_data = pd.DataFrame([[1,2,3],[4,np.nan,np.nan],[7,8,np.nan],[np.nan,np.nan,np.nan]])
cleaned_data = frame_data.dropna()
frame_data# ----输出----0  1  2
0  1.0  2.0  3.0
1  4.0  NaN  NaN
2  7.0  8.0  NaN
3  NaN  NaN  NaNcleaned_data# ----输出----0  1  2
0  1.0  2.0  3.0

如果想要删除所有值都为缺失值的行,则需要传入how='all'

frame_data.dropna(how='all')# ----输出----0  1  2
0  1.0  2.0  3.0
1  4.0  NaN  NaN
2  7.0  8.0  NaN

你可以通过设置 thresh 参数来保留存在一定数量非缺失值的行,即如果设置 thresh=1,则表示如果每行如果存在大等于1个非缺失值,则保留该行,否则删除该行

frame_data.dropna(thresh=1)# ----输出----0  1  2
0  1.0  2.0  3.0
1  4.0  NaN  NaN
2  7.0  8.0  NaN

如果要以列为维度删除缺失值的列,则传入参数 axis=1

frame_data.dropna(axis=1)
3、补全缺失值

在大多数情况下,我们需要对缺失值进行填充,这时我们可以使用 pandas 提供的 fillna 方法来实现我们的需求。使用 fillna 方法时,我们通过传递一个常数来填充缺失值

import pandas as pd
import numpy as np
frame_data = pd.DataFrame([[1,2,3],[4,np.nan,np.nan],[7,8,np.nan],[np.nan,np.nan,np.nan]])
frame_data.fillna(0)# ----输出----0  1  2
0  1.0  2.0  3.0
1  4.0  0.0  0.0
2  7.0  8.0  0.0
3  0.0  0.0  0.0

如果我们需要为不同列设定不同的填充值,则可以通过传入字典的形式,其中字典的属性表示哪一列,字典的属性值表示那一列填充的值

frame_data.fillna({0:0, 1:1, 2:2})# ----输出----0  1  2
0  1.0  2.0  3.0
1  4.0  1.0  2.0
2  7.0  8.0  2.0
3  0.0  1.0  2.0

fillna 默认时返回一个新的填充后的对象,不修改原先的对象,但是我们也可以修改已经存在的对象

frame_data.fillna(0, inplace=True)
frame_data# ----输出----0  1  2
0  1.0  2.0  3.0
1  4.0  0.0  0.0
2  7.0  8.0  0.0
3  0.0  0.0  0.0

我们可以使用 ffill 方法实现前向填充,即将每个缺失值替换为该列上方最近的非缺失值,使用 bfill 方法实现后向填充,即将每个缺失值替换为该列下方最近的非缺失值

frame_data.ffill()# ----输出----0  1  2
0  1.0  2.0  3.0
1  4.0  2.0  3.0
2  7.0  8.0  3.0
3  7.0  8.0  3.0

并且可以使用 limit 限制限制连续填充的次数

frame_data.ffill(limit=1)# ----输出----0  1  2
0  1.0  2.0  3.0
1  4.0  2.0  3.0
2  7.0  8.0  NaN
3  7.0  8.0  NaN

当然我们在实际清洗数据过程中,需要使用 fillna 填充的数据在很多场景下并不是一个固定的参数,而是行或者列的平均值或者中位数,这点跟上面分享的内容是不冲突的,只是将常数或者对应的计算值即可

frame_data.fillna(frame_data.mean())# ----输出----0  1  2
0  1.0  2.0  3.0
1  4.0  5.0  3.0
2  7.0  8.0  3.0
3  4.0  5.0  3.0

但是值得我们注意的是,我们如果要让数据建模的效果好,选择合适的数据补全策略至关重要,除了上面提到的常数、平均值和中位数外,我们还可以利用统计方法(内差/回归)或机器学习(预测)进行缺失值的补全,至于选取哪种方式更好,不同场景的选择方案不同,大家可以通过实验测算每种补全方法得到的结果表现来择优选择最适用相应场景的方法。

二、处理重复值

1、识别重复值

数据中经常会出现重复值,有时候我们需要判断数据中是否存在重复值,然后进行对应分析,再决定要对重复的数据进行哪些处理。我们可以使用 duplicated() 方法来判断 Series 或 DataFrame 中是否存在重复值,其中输出结果为 True 的则表示是重复的值

import pandas as pdframe_data = pd.DataFrame({'name': ['tom','paz','leo','tom','leo'],'age': [11, 10, 10, 11, 12]})
frame_data.duplicated()# ----输出----
0    False
1    False
2    False
3     True
4    False
dtype: bool

当然,我们可以指定数据的任何列来检测是否有重复,例如我们指定 name 列判断其存在重复值的情况

frame_data.duplicated(['name'])# ----输出----
0    False
1    False
2    False
3     True
4     True
dtype: bool
2、删除重复值

当我们需要对数据中的重复值进行处理时,我们可以使用 drop_duplicates 删除每列值都相同的行,Series 和 DataFrame 都有这个方法,以下我们以 DataFrame 来做示例

import pandas as pdframe_data = pd.DataFrame({'name': ['tom','paz','leo','tom','leo'],'age': [11, 10, 10, 11, 12]})
frame_data.drop_duplicates()# ----输出----name age
0  tom  11
1  paz  10
2  leo  10
4  leo  12

可以指定数据的任何列来检测是否有重复,例如我们指定 name 列去除重复值

import pandas as pdframe_data = pd.DataFrame({'name': ['tom','paz','leo','tom','leo'],'age': [11, 10, 10, 11, 12]})
frame_data.drop_duplicates(['name'])# ----输出----name age
0  tom  11
1  paz  10
2  leo  10

drop_duplicates 默认都是保留第一个观测到的值,我们可以传入参数 keep='last' ,将会返回最后一个

import pandas as pdframe_data = pd.DataFrame({'name': ['tom','paz','leo','tom','leo'],'age': [11, 10, 10, 11, 12]})
frame_data.drop_duplicates(keep='last')# ----输出----name age
1  paz  10
2  leo  10
3  tom  11
4  leo  12

本文,我们详细介绍了在数据清洗中我们可以如何识别、处理数据的缺失值和重复值,希望对阅读本文的读者有一定的学习提升和借鉴启发,不足之处也欢迎留言指出。

如果你喜欢本文,欢迎点赞,并且关注我们的微信公众号:Python数据挖掘分析,我们会持续更新数据挖掘分析领域的好文章,让大家在数据挖掘分析领域持续精进提升,成为更好的自己!

同时可以扫描以下二维码,加入 Python数据挖掘分析 群,在群内与众多业界大牛互动,了解行业发展前沿~

图片

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/436401.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Linux服务器】git和github交互使用

前言:有时候pycharm连接不上github,还是得命令行操作 目录 1. 准备git2. 配置github账户3. 上传项目3.1 创建本地仓库3.2 提交本地代码3.3 上传到github 4. 注意 1. 准备git 下载链接:官网 下载后直接运行安装,cmd输入git --vers…

Redis篇(缓存机制 - 多级缓存)(持续更新迭代)

目录 一、传统缓存的问题 二、JVM进程缓存 1. 导入案例 2. 初识Caffeine 3. 实现JVM进程缓存 3.1. 需求 3.2. 实现 三、Lua语法入门 1. 初识Lua 2. HelloWorld 3. 变量和循环 3.1. Lua的数据类型 3.2. 声明变量 3.3. 循环 4. 条件控制、函数 4.1. 函数 4.2. 条…

set和map结构的使用

个人主页:敲上瘾-CSDN博客 个人专栏:游戏、数据结构、c语言基础、c学习、算法 目录 一、序列式容器和关联式容器 二、set和multiset 1.insert 2.erase 3.find 4.count 三、map和mapmulti 1.pair 2.insert 3.find 4.operator[ ] 5.erase 6.lo…

UE虚幻引擎云渲染汽车动画的优势!

在汽车广告和动画制作领域,虚幻引擎(UE)结合云渲染技术正掀起一场技术革命。这项技术以其高性能、成本效益和灵活性,为创作者提供了强大的工具,以实现更加逼真和高效的汽车动画制作。 一、为什么选择UE虚幻引擎制作汽车…

MATLAB案例 | Copula的密度函数和分布函数图

本文介绍各种类型(Gaussian、t、Gumbel、Clayton、Frank)Copula的密度函数和分布函数图的绘制 完整代码 clc close all clear%% ********************计算Copula的密度函数和分布函数图************************ [Udata,Vdata] meshgrid(linspace(0,1…

armbian安装docker

最近又搞了台瑞莎Radxa 3E ,从零开始部署unbuntu环境,发现是真曲折啊,虽然有点前车之鉴了 在Armbian上安装Docker,可以按照以下步骤操作: 1、更新软件包列表: sudo apt-get update 2、安装必要的软件包…

Web和UE5像素流送、通信教程

一、web端配置 首先打开Github地址:https://github.com/EpicGamesExt/PixelStreamingInfrastructure 找到自己虚幻引擎对应版本的项目并下载下来,我这里用的是5.3。 打开项目找到PixelStreamingInfrastructure-master > Frontend > implementat…

算法训练营打卡Day19

目录 1.二叉搜索树的最近公共祖先 2.二叉树中的插入操作 3.删除二叉搜索树中的节点 题目1、二叉搜索树的最近公共祖先 力扣题目链接(opens new window) 给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为:“对于有…

【数据结构与算法】算法和算法分析

文章目录 一.算法1.定义2.描述 二.算法与程序三.算法特性四.算法效率的度量4.1算法时间事前分析法算法时间复杂度的渐进表示法分析算法时间复杂度的基本方法 4.2算法空间 数据的逻辑结构映像到内存就是数据的存储结构,针对数据的逻辑结构可以选择多种存储结构。数据…

python --qt5(webview)/防多开/套壳网页/多次点击激活旧窗口

pyqtwebengine5.12 PyQt55.12class MyWindow(QMainWindow):def __init__(self):super(MyWindow, self).__init__()self.browser QWebEngineView(self) # 如果不写self则新生成一个窗口self.browser.setWindowTitle(技术领域占比分析)self.browser.setWindowIcon(QIcon(LOGO_P…

C0007.Clion中添加ui文件及运行的完整步骤

1.创建ui文件 选择Ui文件目录,右击,打开Qt Designer; 创建完成后,保存ui界面,并且命名为test.ui; 2.新建头文件test.h 在include目录中,新建头文件,文件名为test.h 3.新建test.cpp源文件

基于SpringBoot的休闲娱乐代理售票系统设计与实现

1.1研究背景 21世纪,我国早在上世纪就已普及互联网信息,互联网对人们生活中带来了无限的便利。像大部分的企事业单位都有自己的系统,由从今传统的管理模式向互联网发展,如今开发自己的系统是理所当然的。那么开发休闲娱乐代理售票…

Leetcode面试经典150题-322.零钱兑换

给你一个整数数组 coins ,表示不同面额的硬币;以及一个整数 amount ,表示总金额。 计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额,返回 -1 。 你可以认为每种硬币的数量是无限的。 示…

Java项目实战II基于Java+Spring Boot+MySQL的大创管理系统(源码+数据库+文档)

目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发,CSDN平台Java领域新星创作者 一、前言 在当前创新创业氛围浓厚的背景下,大学生创新创业项目(简称“大创”&#xff0…

【MySQL】-- 数据库基础

文章目录 1. 数据库简介1.1 什么是数据库1.2 什么是关系型数据库 2. 客户端与服务器的通讯方式2.1 CS架构 3. MySQL架构 1. 数据库简介 1.1 什么是数据库 什么是数据库? 组织和保存数据的应用程序。数据库和之前学的数据结构有什么关系? 数据结构是组织数…

第168天:应急响应-ELK 日志分析系统Yara规则样本识别特征提取规则编写

目录 案例一:ELK 搭建使用-导入文件&监控日志&语法筛选 案例二:Yara 规则使用-规则检测&分析特征&自写规则 案例一:ELK 搭建使用-导入文件&监控日志&语法筛选 该软件是专业分析日志的工具,但是不支持安…

Java应用程序的服务器有哪些?

1.Tomcat、Jetty 和 JBoss 区别? Apache Tomcat、Jetty 和 JBoss都是用于部署Java应用程序的服务器,它们都支持Servlet、JSP和其他Java EE(现在称为Jakarta EE)技术。尽管它们有一些相似的功能,但它们之间还是存在一些…

快速了解:MySQL InnoDB和MyISAM的区别

目录 一、序言二、InnoDB和MyISAM对比1、InnoDB特性支持如下2、MyISAM特性支持如下 三、两者核心区别1、事务支持2、锁机制3、索引结构4、缓存机制5、故障恢复6、使用场景 一、序言 在MySQL 8.0中,InnoDB是默认的存储引擎。除了InnoDB,MySQL还支持其它的…

小程序原生-利用setData()对不同类型的数据进行增删改

1. 声明和绑定数据 wxml文件 <view> {{school}} </view> <view>{{obj.name}}</view> <view id"{{id}}" > 绑定属性值 </view> <checkbox checked"{{isChecked}}"/> <!--算数运算--> <view>{{ id …

Python 课程20-Scikit-learn

前言 Scikit-learn 是 Python 中最流行的机器学习库之一&#xff0c;它提供了多种用于监督学习和无监督学习的算法。Scikit-learn 的特点是简单易用、模块化且具有高效的性能。无论是初学者还是专业开发者&#xff0c;都可以借助它进行快速原型设计和模型开发。 在本教程中&a…