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

news2024/10/1 15:55:05

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

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

一、处理缺失值

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

1、缺失值表示

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

import pandas as pd
import numpy as np

series_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 np

series_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 np

series_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 np

frame_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  NaN

cleaned_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 pd

frame_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 pd

frame_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 pd

frame_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 pd

frame_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.coloradmin.cn/o/2182655.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[uni-app]小兔鲜-05登录+个人中心

登录 微信授权登录: 通过wx.login()获取code登录凭证, 通过特定类型按钮获取用户手机号, 实现授权登录 import type { LoginResult } from /types/member import { http } from /utils/httptype LoginParams {code: stringencryptedData: stringiv: string }// 微信登录 expo…

每日一题|983. 最低票价|动态规划、记忆化递归

本题求解最小值,思路是动态规划,但是遇到的问题是:动态规划更新的顺序和步长,以及可能存在的递归溢出问题。 1、确定dp数组含义 dp[i]表示第i天到最后一天(可能不在需要出行的天数里),需要花费…

图神经网络DGL库之消息传递

图神经网络DGL库之消息传递 1 消息传递1.1 图解1.2 语法格式1.2.1 message函数1.2.2 reduce函数1.2.3 update函数1.2.4 apply_nodes函数1.2.5 apply_edges函数 2 具体例子2.1 建图2.2 消息传递2.2.1 函数构造2.2.2 边更新2.2.3 节点更新2.2.4 消息聚合1 未使用更新函数2 使用更…

M3u8视频由手机拷贝到电脑之后,通过potplayer播放报错找不到文件地址怎么解决?

该文章前面三节主要介绍M3u8视频是什么,视频播放错误(找不到地址)的解决方法在后面 M3U8是一种多媒体播放列表文件格式,主要用于流媒体播放。 一、文件格式特点 1. 文本文件:M3U8是一个采用 UTF-8 编码的文本文件,这意味着它可…

Shell入门基础学习笔记

目录 第1章 Shell概述 第2章 Shell解析器 第3章 Shell脚本入门 第4章 Shell中的变量 4.1 系统变量 4.2 自定义变量 4.3 特殊变量:$n 4.4 特殊变量:$# 4.5 特殊变量:$*、$ 4.6 特殊变量:$? 第5章 运算符 …

玩机进阶教程----MTK芯片机型修改串码IMEI 修改MEID 修复基带步骤详细演示 总结

在前面的博文中有对MTK芯片机型修改参数步骤做过解析。但其中有些步骤友友不太了解。在以前MTK芯片 3G 4G的机型中有使用老版本修改工具SN_Writer_Tool来修改,但对于新版本mtk芯片机型兼容性不是太好。而且局限于必须有基带BP AP文件。今天针对新工具Modem META 修改 做个补充…

国外问卷调查匠哥已经不带人了,但是还可以交流

国外问卷调查匠哥已经不带人了,但是还可以来和匠哥交流, 为啥不带人了呢? 从今年年初开始,匠哥在带学员的过程中发现: 跟往年同样的收费,同样的教学,甚至我付出的时间精力比以前还多&#xff…

Java | Leetcode Java题解之第447题回旋镖的数量

题目&#xff1a; 题解&#xff1a; class Solution {public int numberOfBoomerangs(int[][] points) {int ans 0;for (int[] p : points) {Map<Integer, Integer> cnt new HashMap<Integer, Integer>();for (int[] q : points) {int dis (p[0] - q[0]) * (p[…

如何构建一个生产级的AI平台(1)?

本文概述了生成式 AI 平台的常见组件、它们的作用以及它们的实现方式。 本文重点介绍部署 AI 应用程序的整体架构。 它讨论了需要哪些组件以及构建这些组件时的注意事项。 它不是关于如何构建 AI 应用程序。 这就是整体架构的样子。 这是一个相当复杂的系统。 这篇文章将从最…

基于Leaflet和天地图的细直箭头和突击方向标绘实战

目录 前言 一、细直箭头和突击方向的类设计 1、总体类图 2、对象区别 二、标绘绘制的具体实现 1、绘制时序图 2、相关点的具体绘制 3、最终的成果 三、总结 前言 今天是10月1日国庆节&#xff0c;迎来我们伟大祖国75周年的华诞。有国才有家&#xff0c;在这里首先祝我们…

【vs code(cursor) ssh连不上服务器(2)】但是 Terminal 可以连上,问题解决 ✅

【vs code(cursor) ssh连不上服务器】但是 Terminal 可以连上&#xff0c;问题解决 ✅ 对于类似的问题&#xff0c;之前的解决方法是清洗配置文件再重新连接。当重新连接不起作用时&#xff0c;可以再试下本文的方法。 问题描述&#xff1a;SSH 超时错误 vs code 连不上 ssh…

解决方案:机器学习中,回归及分类常用的模型评估指标有哪些

文章目录 一、现象二、解决方案回归任务的评价指标&#xff1a;均方误差 (MSE):平均绝对误差 (MAE): 分类任务的评价指标&#xff1a;准确率 (Accuracy):混淆矩阵 (Confusion Matrix):精确度 (Precision):召回率 (Recall):F1分数 (F1 Score):ROC曲线 (Receiver Operating Chara…

Qt的互斥量用法

目的 互斥量的概念 互斥量是一个可以处于两态之一的变量:解锁和加锁。这样&#xff0c;只需要一个二进制位表示它&#xff0c;不过实际上&#xff0c;常常使用一个整型量&#xff0c;0表示解锁&#xff0c;而其他所有的值则表示加锁。互斥量使用两个过程。当一个线程(或进程)…

ubuntu 24.04如何分配内存

24版与之前有一点不同&#xff0c;这里记录一下我的经历&#xff0c;希望有帮助 1.进入ubuntu直接试用&#xff0c;没有之前的安装向导&#xff08;如图&#xff09;&#xff0c;在屏幕的左上角会找到安装Ubuntu 2.分配内存 24的手动分配内存&#xff0c;不需要分配系统内存&…

IOT平台颜值天花板?延凡科技物联网平台让人惊叹不已

IOT平台颜值天花板&#xff1f;延凡科技物联网平台让人惊叹不已 在物联网的时代&#xff0c;AIOT平台凭借智能化的管理和决策能力&#xff0c;为多个行业带来了巨大的提升。本文将为大家介绍AIOT物联网平台的核心功能、应用场景以及它是如何改变我们的生活的。 平台简介 AIOT物…

二维环境下的TDOA测距定位的MATLAB代码,带中文注释

TDOA测距定位程序介绍 概述 本MATLAB程序实现了基于时间差到达&#xff08;TDOA&#xff09;技术的二维测距定位&#xff0c;能够处理4个或任意数量&#xff08;大于3个&#xff09;的锚节点。在无线定位和导航系统中&#xff0c;TDOA是一种常用的定位方法&#xff0c;通过测量…

一款免费开源的接口测试工具——ApiFox详细教程

前言 APIfox是一种功能强大的接口测试工具&#xff0c;它可以帮助用户轻松地进行REST API的自动化测试和文档编写。本文将从以下几个方面介绍APIfox的基本使用方法、特点和优势。 一、什么是APIfox&#xff1f; APIfox是一款基于Web的REST API测试工具&#xff0c;通过创建测…

论文笔记:LAFF 文本到视频检索的新基准

整理了ECCV2022 Lightweight Attentional Feature Fusion: A New Baseline for Text-to-Video Retrieval 论文的阅读笔记 背景模型问题定义LAFF(Lightweight Attention Feature Fusion)LAFF Block 实验消融实验可视化对比试验 这篇文章提出了一种新颖灵活的特征融合方式&#x…

初步认识产品经理

产品经理 思考问题的维度 1️⃣为什么要抓住核心用户&#xff1f; 所有和产品有关系的群体就是用户&#xff0c;存在共性和差异了解用户的付费点&#xff0c;更好的优化产品是否使用&#xff1a;&#xff08;目标用户-已使用产品&#xff1a;种子用户-尝鲜&#xff1b;核心用…

【Golang】深入解读Go语言中的错误(error)与异常(panic)

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…