还在为数据清洗抓狂?这里有一个简单实用的清洗代码集

2023-10-27

选自towardsdatascience,作者:Admond Lee,机器之心编译,参与:Geek AI、张倩。

数据清洗是数据科学家逃不掉的一份苦差事。为了让这项工作不那么痛苦,本文作者分享了自己的数据清洗代码集。

现实世界中的数据通常质量不高,作为一名数据科学家,有时也需要承担一部分数据清洗的工作,这要求数据科学家们应该能够在进行数据分析或建模工作之前执行数据清洗步骤,从而确保数据的质量最佳。

不过长话短说,在数据科学领域工作了很长一段时间后,我切实感受到了在进行数据分析、可视化和建模工作之前,进行数据清洗工作是多么痛苦。

不管你承不承认,数据清洗着实不是一件简单的任务,大多数情况下这项工作是十分耗时而乏味的,但它又是十分重要的。

如果你经历过数据清洗的过程,你就会明白我的意思。而这正是撰写这篇文章的目的——让读者更轻松地进行数据清洗工作。

事实上,我在不久前意识到,在进行数据清洗时,有一些数据具有相似的模式。也正是从那时起,我开始整理并编译了一些数据清洗代码(见下文),我认为这些代码也适用于其它的常见场景。

由于这些常见的场景涉及到不同类型的数据集,因此本文更加侧重于展示和解释这些代码可以用于完成哪些工作,以便读者更加方便地使用它们。

我的数据清洗小工具箱

在下面的代码片段中,数据清洗代码被封装在了一些函数中,代码的目的十分直观。你可以直接使用这些代码,无需将它们嵌入到需要进行少量参数修改的函数中。

1. 删除多列数据

def drop_multiple_col(col_names_list, df): 
    '''
    AIM    -> Drop multiple columns based on their column names 

    INPUT  -> List of column names, df

    OUTPUT -> updated df with dropped columns 
    ------
    '''
    df.drop(col_names_list, axis=1, inplace=True)
    return df复制代码

有时,并不是所有列的数据都对我们的数据分析工作有用。因此,「df.drop」可以方便地删掉你选定的列。

2. 转换 Dtypes

def change_dtypes(col_int, col_float, df): 
    '''
    AIM    -> Changing dtypes to save memory

    INPUT  -> List of column names (int, float), df

    OUTPUT -> updated df with smaller memory  
    ------
    '''
    df[col_int] = df[col_int].astype('int32')
    df[col_float] = df[col_float].astype('float32')复制代码

当我们面对更大的数据集时,我们需要对「dtypes」进行转换,从而节省内存。如果你有兴趣学习如何使用「Pandas」来处理大数据,我强烈推荐你阅读「Why and How to Use Pandas with Large Data」这篇文章(https://towardsdatascience.com/why-and-how-to-use-pandas-with-large-data-9594dda2ea4c)。

3. 将分类变量转换为数值变量

def convert_cat2num(df):
    # Convert categorical variable to numerical variable
    num_encode = {'col_1' : {'YES':1, 'NO':0},
                  'col_2'  : {'WON':1, 'LOSE':0, 'DRAW':0}}  
    df.replace(num_encode, inplace=True)  复制代码

有一些机器学习模型要求变量是以数值形式存在的。这时,我们就需要将分类变量转换成数值变量然后再将它们作为模型的输入。对于数据可视化任务来说,我建议大家保留分类变量,从而让可视化结果有更明确的解释,便于理解。

4. 检查缺失的数据

def check_missing_data(df):
    # check for any missing data in the df (display in descending order)
    return df.isnull().sum().sort_values(ascending=False)复制代码

如果你想要检查每一列中有多少缺失的数据,这可能是最快的方法。这种方法可以让你更清楚地知道哪些列有更多的缺失数据,帮助你决定接下来在数据清洗和数据分析工作中应该采取怎样的行动。

5. 删除列中的字符串

def remove_col_str(df):
    # remove a portion of string in a dataframe column - col_1
    df['col_1'].replace('\n', '', regex=True, inplace=True)

    # remove all the characters after &# (including &#) for column - col_1
    df['col_1'].replace(' &#.*', '', regex=True, inplace=True)复制代码

有时你可能会看到一行新的字符,或在字符串列中看到一些奇怪的符号。你可以很容易地使用 df['col_1'].replace 来处理该问题,其中「col_1」是数据帧 df 中的一列。

6. 删除列中的空格

def remove_col_white_space(df):
    # remove white space at the beginning of string 
    df[col] = df[col].str.lstrip()复制代码

当数据十分混乱时,很多意想不到的情况都会发生。在字符串的开头有一些空格是很常见的。因此,当你想要删除列中字符串开头的空格时,这种方法很实用。

7. 将两列字符串数据(在一定条件下)拼接起来

def concat_col_str_condition(df):
    # concat 2 columns with strings if the last 3 letters of the first column are 'pil'
    mask = df['col_1'].str.endswith('pil', na=False)
    col_new = df[mask]['col_1'] + df[mask]['col_2']
    col_new.replace('pil', ' ', regex=True, inplace=True)  # replace the 'pil' with emtpy space复制代码

当你希望在一定条件下将两列字符串数据组合在一起时,这种方法很有用。例如,你希望当第一列以某些特定的字母结尾时,将第一列和第二列数据拼接在一起。根据你的需要,还可以在拼接工作完成后将结尾的字母删除掉。

8. 转换时间戳(从字符串类型转换为日期「DateTime」格式)

def convert_str_datetime(df): 
    '''
    AIM    -> Convert datetime(String) to datetime(format we want)

    INPUT  -> df

    OUTPUT -> updated df with new datetime format 
    ------
    '''
    df.insert(loc=2, column='timestamp', value=pd.to_datetime(df.transdate, format='%Y-%m-%d %H:%M:%S.%f'))复制代码

在处理时间序列数据时,你可能会遇到字符串格式的时间戳列。这意味着我们可能不得不将字符串格式的数据转换为根据我们的需求指定的日期「datetime」格式,以便使用这些数据进行有意义的分析和展示。



本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

还在为数据清洗抓狂?这里有一个简单实用的清洗代码集 的相关文章

  • python:查找围绕某个 GPS 位置的圆的 GPS 坐标的优雅方法

    我有一组以十进制表示的 GPS 坐标 并且我正在寻找一种方法来查找每个位置周围半径可变的圆中的坐标 这是一个例子 http green and energy com downloads test circle html我需要什么 这是一个圆
  • 使用 python requests 模块时出现 HTTP 503 错误

    我正在尝试发出 HTTP 请求 但当前可以从 Firefox 浏览器访问的网站响应 503 错误 代码本身非常简单 在网上搜索一番后我添加了user Agent请求参数 但也没有帮助 有人能解释一下如何消除这个 503 错误吗 顺便说一句
  • Python 中的舍入浮点问题

    我遇到了 np round np around 的问题 它没有正确舍入 我无法包含代码 因为当我手动设置值 而不是使用我的数据 时 返回有效 但这是输出 In 177 a Out 177 0 0099999998 In 178 np rou
  • 跟踪 pypi 依赖项 - 谁在使用我的包

    无论如何 是否可以通过 pip 或 PyPi 来识别哪些项目 在 Pypi 上发布 可能正在使用我的包 也在 PyPi 上发布 我想确定每个包的用户群以及可能尝试积极与他们互动 预先感谢您的任何答案 即使我想做的事情是不可能的 这实际上是不
  • 删除flask中的一对一关系

    我目前正在使用 Flask 开发一个应用程序 并且在删除一对一关系中的项目时遇到了一个大问题 我的模型中有以下结构 class User db Model tablename user user id db Column db String
  • 使用字典映射数据帧索引

    为什么不df index map dict 工作就像df column name map dict 这是尝试使用index map的一个小例子 import pandas as pd df pd DataFrame one A 10 B 2
  • 如何使用 Pandas、Numpy 加速 Python 中的嵌套 for 循环逻辑?

    我想检查一下表的字段是否TestProject包含了Client端传入的参数 嵌套for循环很丑陋 有什么高效简单的方法来实现吗 非常感谢您的任何建议 def test parameter a list parameter b list g
  • 在Python中连接反斜杠

    我是 python 新手 所以如果这听起来很简单 请原谅我 我想加入一些变量来生成一条路径 像这样 AAAABBBBCCCC 2 2014 04 2014 04 01 csv Id TypeOfMachine year month year
  • datetime.datetime.now() 返回旧值

    我正在通过匹配日期查找 python 中的数据存储条目 我想要的是每天选择 今天 的条目 但由于某种原因 当我将代码上传到 gae 服务器时 它只能工作一天 第二天它仍然返回相同的值 例如当我上传代码并在 07 01 2014 执行它时 它
  • Python 2:SMTPServerDisconnected:连接意外关闭

    我在用 Python 发送电子邮件时遇到一个小问题 me my email address you recipient s email address me email protected cdn cgi l email protectio
  • Docker 中的 Python 日志记录

    我正在 Ubuntu Web 服务器上的 Docker 容器中测试运行 python 脚本 我正在尝试查找由 Python Logger 模块生成的日志文件 下面是我的Python脚本 import time import logging
  • 如何通过 TLS 1.2 运行 django runserver

    我正在本地 Mac OS X 机器上测试 Stripe 订单 我正在实现这段代码 stripe api key settings STRIPE SECRET order stripe Order create currency usd em
  • 如何通过索引列表从 dask 数据框中选择数据?

    我想根据索引列表从 dask 数据框中选择行 我怎样才能做到这一点 Example 假设我有以下 dask 数据框 dict A 1 2 3 4 5 6 7 B 2 3 4 5 6 7 8 index x1 a2 x3 c4 x5 y6 x
  • import matplotlib.pyplot 给出 AttributeError: 'NoneType' 对象没有属性 'is_interactive'

    我尝试在 Pycharm 控制台中导入 matplotlib pyplt import matplotlib pyplot as plt 然后作为回报我得到 Traceback most recent call last File D Pr
  • Python:XML 内所有标签名称中的字符串替换(将连字符替换为下划线)

    我有一个格式不太好的 XML 标签名称内有连字符 我想用下划线替换它 以便能够与 lxml objectify 一起使用 我想替换所有标签名称 包括嵌套的子标签 示例 XML
  • 模拟pytest中的异常终止

    我的多线程应用程序遇到了一个错误 主线程的任何异常终止 例如 未捕获的异常或某些信号 都会导致其他线程之一死锁 并阻止进程干净退出 我解决了这个问题 但我想添加一个测试来防止回归 但是 我不知道如何在 pytest 中模拟异常终止 如果我只
  • Pandas 每周计算重复值

    我有一个Dataframe包含按周分组的日期和 ID df date id 2022 02 07 1 3 5 4 2022 02 14 2 1 3 2022 02 21 9 10 1 2022 05 16 我想计算每周有多少 id 与上周重
  • 更改 Tk 标签小部件中单个单词的颜色

    我想更改 Tkinter 标签小部件中单个单词的字体颜色 我知道可以使用文本小部件来实现与我想要完成的类似的事情 例如使单词 YELLOW 显示为黄色 self text tag config tag yel fg clr yellow s
  • cv2.VideoWriter:请求一个元组作为 Size 参数,然后拒绝它

    我正在使用 OpenCV 4 0 和 Python 3 7 创建延时视频 构造 VideoWriter 对象时 文档表示 Size 参数应该是一个元组 当我给它一个元组时 它拒绝它 当我尝试用其他东西替换它时 它不会接受它 因为它说参数不是
  • 使用随机放置的 NaN 创建示例 numpy 数组

    出于测试目的 我想创建一个M by Nnumpy 数组与c随机放置的 NaN import numpy as np M 10 N 5 c 15 A np random randn M N A mask np nan 我在创建时遇到问题mas

随机推荐

  • python查看变量内存地址的内置函数是_查看变量内存地址的Python内置函数是____...

    查看变量内存地址的Python内置函数是 答 id 产妇乳汁分泌主要依赖于 答 哺乳时吸吮刺激 下列选项中 属于 路径面板 中的工具按钮的是 答 用前景色填充路径 用画笔描边路径 将路径作为选区载入 从选区生成工作路径 添加图层蒙版 属于一
  • CentOS 8 Cannot prepare internal mirrorlist No URLs in mirrorlist

    CentOS 8 Cannot prepare internal mirrorlist No URLs in mirrorlist 解决方法 输入以下命令 sudo dnf install y curl policycoreutils op
  • 【Linux网络编程笔记】TCP短连接产生大量TIME_WAIT导致无法对外建立新TCP连接的原因及解决方法—基础知识篇

    最近遇到一个线上报警 服务器出现大量TIME WAIT导致其无法与下游模块建立新HTTP连接 在解决过程中 通过查阅经典教材和技术文章 加深了对TCP网络问题的理解 作为笔记 记录于此 备注 本文主要介绍TCP编程中涉及到的众多基础知识 关
  • spring源码学习:spring初始化流程

    首先借个图 说明一下spring的bean的整个生命流程 销毁什么的这个看图就知道怎么回事 使用的话一般都是纯业务 而且我们更关心spring是怎么初始化的 初始化成我们定义的那个样子 我们就是以这个出发点来看一下spring的大概流程 s
  • GIS_开源GIS

    GIS 开源GIS 图 文 QGIS QGIS是一个开放源码的地理信息系统 该项目诞生于2002年5月 并于同年6月作为SourceForge上的一个项目建立 我们一直在努力使GIS软件 传统上是昂贵的专有软件 成为任何人都可以使用个人电脑
  • python ADF检验

    前言 本文对ADF检验进行研究 python示例代码 不对概念进行分析介绍 Code import numpy as np import matplotlib pyplot as plt from statsmodels tsa statt
  • EPOLLRDHUP EPOLLHUP 事件

    EPOLLRDHUP是从Linux内核2 6 17开始由GNU引入的事件 对端正常关闭 程序里close shell下kill或ctr c 触发EPOLLIN和EPOLLRDHUP 但是不触发EPOLLERR 和EPOLLHUP 再man
  • 最新物联网毕设100例(一)

    单片机毕业设计项目分享系列 这里是DD学长 单片机毕业设计及享100例系列的第一篇 目的是分享高质量的毕设作品给大家 包含全面内容 源码 原理图 PCB 实物演示 论文 这两年开始毕业设计和毕业答辩的要求和难度不断提升 传统的单片机项目缺少
  • 图像分割套件PaddleSeg全面解析(八)预测代码解读

    训练完成模型之后 可以对图片进行预测 还可以实现模型结果可视化 查看分割效果 运行命令如下 python predict py config configs quick start bisenet optic disc 512x512 1k
  • C# ListView用法详解

    拖控件 listView 控件到新建form中 并添加相应的button lable和textbox 如下图 1 点击表格右上角的三角形 添加表头信息 2 Name 程序里调用的名称 Text 表格里显示的信息 其它可以设置大小等信息 3
  • 视频托管--七牛云

    目录 vue video player 视频托管 vue video player 安装 npm install vue video player S 在main js导入 vue video播放器 require video js dis
  • npm登录:忘记了用户名和密码,通过邮箱找回流程

    登录npm时发现用户名和密码我都忘了 幸好绑定了邮箱 通过邮箱重设密码与登录 1 在npm官网sign in界面点击Forgot password 2 输入邮箱发送email 3 邮件中会给出你的用户名和一个地址跳转链接 点击跳转链接 4
  • 查看docker运行中的命令行输出

    访问本站观看效果更佳 当我在用docker跑pytorch时 因为训练时间长 网络不好的时候 终端会停止输出命令行结果 为了查看命令行的输出结果 我们可以运行如下命令 docker logs ID或者名字 可以查看容器内部的标准输出 下面再
  • cmmi实践访谈测试ppt_汽车嵌入式软件测试——软件质量度量评价指标

    在上一期中 介绍了常见的软件质量度量模型 McCall Boehm ISO 9126模型 通过这些模型可以对软件质量进行科学的评价 在本期中 主要介绍 7个软件质量的评价指标 编码规范 源代码行 千行代码bug率 圈复杂度 代码覆盖率 扇入
  • Tensorflow Lite之编译生成tflite文件

    这是tensorflow生成的各种模型文件 GraphDef pb a protobuf that represents the TensorFlow training and or computation graph This conta
  • web开发中的四个域对象生命周期 作用域详细介绍

    Web开发中的四个域对象 有范围小到大 page jsp有效 request 一次请求 session 一次会话 application 当前web应用 page域指的是pageContext request域指的是HttpServletR
  • forEach 中的 return 到底有效吗?如何优雅地中断 forEach 循环?

    在JavaScript中 forEach是一个常用的数组遍历方法 然而 很多人可能误解了forEach中的return语句的作用 本文将详细解释forEach中的return是否有效以及如何优雅地中断forEach循环 forEach 中的
  • swagger主页访问报错500

    背景 有一天前端给我要接口文档 我给发了个接口文档路径 结果直接报错500 截图如下 原因分析 500报错 看后台日志 java lang NullPointerException null at springfox documentati
  • R语言之函数调用

    处理数据对象的实用函数 函 数 功 能 length object 显示对象中元素 成分的数量 dim object 显示对象的维度 str object 显示对象的结构 class object 显示对象的类型 mode object 显
  • 还在为数据清洗抓狂?这里有一个简单实用的清洗代码集

    选自towardsdatascience 作者 Admond Lee 机器之心编译 参与 Geek AI 张倩 数据清洗是数据科学家逃不掉的一份苦差事 为了让这项工作不那么痛苦 本文作者分享了自己的数据清洗代码集 现实世界中的数据通常质量不