越洗越黑”的Pandas数据清洗

news2025/1/23 11:58:58

引言

先来一个脑筋急转弯活跃一下枯燥工作日常,问:“什么东西越洗越黑?” 有没有猜到的?猜不到我告诉你吧! 答案是“煤球”。那么这个脑机急转弯跟我们要讨论的话题有没有关系呢?

嗯是的,还是沾点儿边儿的。

我们经常在项目上生产线之前,肯定会先在测试服上进行测试,测试之前肯定会将垃圾数据清理掉,防止脏数据影响我们正常的测试逻辑。

在我们pyhton语言中,也提供了清理无用数据,进行数据清洗的库Pandas, 确实也用了一下,封装的方法的确挺好用,但也同时碰到了一些问题,接下来分享一下吧。

知道 😮

在正式分享之前,我们得先知道Pandas库是干什么用的?它就是一个主要进行数据读取,数据清理提供方法的这么一个库。至于它的安装方式,非常简单👌,只要电脑安装了Pyhton环境,那么我们就使用cmd小黑屏使用pip进行安装即可。这里大概写一下吧,pip install pandas。安装完成以后,命令行进行查看是否安装成功python -c "import pandas; print(pandas.__version__)"

关于Pandas库是干什么的?如何安装它,我们大概就说这么多,下面将探讨我遇到的数据清洗的问题。

问题 😱

Pandas库给我们提供非常丰富的数据🚿清洗的函数,其中我们用的多的大概就是 dropna() 函数了。

dropna()函数的格式是这样的:DataFrame.dropna(axis=0, how='any', thresh=None, subset=None, inplace=False)。其中axis:哪个轴(这个我们很熟悉了);how:设置整行还是所有;inplace:bool型,如果赋值为True的话,修改的是源数据。

我们浅浅的使用一下,实例代码如下:

"""
@Created on : 2024/5/29 10:56
@creator : er_nao
@File :pandas_06_数据清洗.py
@Description :
"""
import pandas as pd

df = pd.read_csv("../property-data.csv")

print(df)
print('\n')
print(df['NUM_BEDROOMS'])
print('\n')
print(df['NUM_BEDROOMS'].isnull())
print('\n')
# 使用dropna删除包含空数据的行
# 默认情况下,dropna() 方法返回一个新的 DataFrame,不会修改源数据
print('使用dropna删除包含空数据的行')
new_df = df.dropna()
print(new_df.to_string())
print('\n')
print(df.to_string())

# 如果你要修改源数据 DataFrame, 可以使用 inplace = True 参数:
print('\n')
print('使用 inplace = True')
df.dropna(inplace=True)
print(df.to_string())

# 输出结果

#        PID  ST_NUM     ST_NAME OWN_OCCUPIED NUM_BEDROOMS NUM_BATH SQ_FT
# 0  100001000.0   104.0      PUTNAM            Y            3        1  1000
# 1  100002000.0   197.0   LEXINGTON            N            3      1.5    --
# 2  100003000.0     NaN   LEXINGTON            N          NaN        1   850
# 3  100004000.0   201.0    BERKELEY           12            1      NaN   700
# 4          NaN   203.0    BERKELEY            Y            3        2  1600
# 5  100006000.0   207.0    BERKELEY            Y          NaN        1   800
# 6  100007000.0     NaN  WASHINGTON          NaN            2   HURLEY   950
# 7  100008000.0   213.0     TREMONT            Y            1        1   NaN
# 8  100009000.0   215.0     TREMONT            Y           na        2  1800
# 
# 
# 0      3
# 1      3
# 2    NaN
# 3      1
# 4      3
# 5    NaN
# 6      2
# 7      1
# 8     na
# Name: NUM_BEDROOMS, dtype: object
# 
# 
# 0    False
# 1    False
# 2     True
# 3    False
# 4    False
# 5     True
# 6    False
# 7    False
# 8    False
# Name: NUM_BEDROOMS, dtype: bool
# 
# 
# 使用dropna删除包含空数据的行
#            PID  ST_NUM    ST_NAME OWN_OCCUPIED NUM_BEDROOMS NUM_BATH SQ_FT
# 0  100001000.0   104.0     PUTNAM            Y            3        1  1000
# 1  100002000.0   197.0  LEXINGTON            N            3      1.5    --
# 8  100009000.0   215.0    TREMONT            Y           na        2  1800
# 
# 
#            PID  ST_NUM     ST_NAME OWN_OCCUPIED NUM_BEDROOMS NUM_BATH SQ_FT
# 0  100001000.0   104.0      PUTNAM            Y            3        1  1000
# 1  100002000.0   197.0   LEXINGTON            N            3      1.5    --
# 2  100003000.0     NaN   LEXINGTON            N          NaN        1   850
# 3  100004000.0   201.0    BERKELEY           12            1      NaN   700
# 4          NaN   203.0    BERKELEY            Y            3        2  1600
# 5  100006000.0   207.0    BERKELEY            Y          NaN        1   800
# 6  100007000.0     NaN  WASHINGTON          NaN            2   HURLEY   950
# 7  100008000.0   213.0     TREMONT            Y            1        1   NaN
# 8  100009000.0   215.0     TREMONT            Y           na        2  1800
# 
# 
# 使用 inplace = True
#            PID  ST_NUM    ST_NAME OWN_OCCUPIED NUM_BEDROOMS NUM_BATH SQ_FT
# 0  100001000.0   104.0     PUTNAM            Y            3        1  1000
# 1  100002000.0   197.0  LEXINGTON            N            3      1.5    --
# 8  100009000.0   215.0    TREMONT            Y           na        2  1800

我们可以看到,使用dropna()函数后,虽然会将有空值,NaN,na这些数据所在的行剔除掉🗑,个人认为这样非常的不友好🙅‍♂️,那么有其他办法不剔除掉吗?答案是有的。

Pandas库还给我们提供了一个fillna函数 我们可以使用它将那些空值,NaN替换让数据变得有意义。

"""
@Created on : 2024/5/29 10:56
@creator : er_nao
@File :pandas_06_数据清洗.py
@Description :
"""
import pandas as pd

df = pd.read_csv("../property-data.csv")
print('源数据')
print(df)
print('\n')

# 使用 mean() 方法计算列的均值并替换空单元格
print('使用fillna')
x = df['ST_NUM'].mean()
df['ST_NUM'].fillna(x, inplace=True)
print(df.to_string())

# 输出结果

# 源数据
#            PID  ST_NUM     ST_NAME OWN_OCCUPIED NUM_BEDROOMS NUM_BATH SQ_FT
# 0  100001000.0   104.0      PUTNAM            Y            3        1  1000
# 1  100002000.0   197.0   LEXINGTON            N            3      1.5    --
# 2  100003000.0     NaN   LEXINGTON            N          NaN        1   850
# 3  100004000.0   201.0    BERKELEY           12            1      NaN   700
# 4          NaN   203.0    BERKELEY            Y            3        2  1600
# 5  100006000.0   207.0    BERKELEY            Y          NaN        1   800
# 6  100007000.0     NaN  WASHINGTON          NaN            2   HURLEY   950
# 7  100008000.0   213.0     TREMONT            Y            1        1   NaN
# 8  100009000.0   215.0     TREMONT            Y           na        2  1800
# 
# 
# 使用fillna
#            PID      ST_NUM     ST_NAME OWN_OCCUPIED NUM_BEDROOMS NUM_BATH SQ_FT
# 0  100001000.0  104.000000      PUTNAM            Y            3        1  1000
# 1  100002000.0  197.000000   LEXINGTON            N            3      1.5    --
# 2  100003000.0  191.428571   LEXINGTON            N          NaN        1   850
# 3  100004000.0  201.000000    BERKELEY           12            1      NaN   700
# 4          NaN  203.000000    BERKELEY            Y            3        2  1600
# 5  100006000.0  207.000000    BERKELEY            Y          NaN        1   800
# 6  100007000.0  191.428571  WASHINGTON          NaN            2   HURLEY   950
# 7  100008000.0  213.000000     TREMONT            Y            1        1   NaN
# 8  100009000.0  215.000000     TREMONT            Y           na        2  1800

大家可以看到,ST_NUM这一列计算了平均值,并且将之前的NaN也替换成了平均值。但是控制台的打印真的是这样吗?请看下图:

image.png

呀~~ 🦆🦆🦆 ,控制台居然有报红,我们程序员看到报红脑子第一个闪现的念头就是报错了。数据清洗还给洗出BUG了?那清洗还有什么意义。

经过分析,这不是报错,而是警告😡! 意思就是我们的写法有问题呗。既然这样,我们就遵从人家的提示,就改吧。

image.png

这儿的意思就是让我们改成这种形式,好的。

image.png

咿?!神奇呦🧙。果然不爆红了。那么这两种写法到底有什么区别呢?

a写法: df.method({col: value}, inplace=True)

b写法: df[col].method(value, inplace=True)

这其实就是一个链式赋值问题的问题,当使用b写法的时候,Pandas它不知道到底是想在原始DataFrame上进行更改,还是想创建一个副本进行更改,所以就会引发我们控制台的这个异常。

而a写法它通常是对整个DataFrame应用一个方法,同时传入一个列名与值的映射,指定要修改的列和相应的值。

作者:二闹
链接:https://juejin.cn/post/7374243125458649124

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

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

相关文章

2024年大屏幕互动源码+动态背景图和配乐素材+搭建教程

2024年大屏幕互动源码动态背景图和配乐素材搭建教程 php宝塔搭建部署活动现场大屏幕互动系统php源码 运行环境:PHPMYSQL 下载源码地址:极速云

Leetcode刷题笔记7

69. x 的平方根 69. x 的平方根 - 力扣(LeetCode) 假设求17的平方根 解法一:暴力解法 从1开始依次尝试 比如1的平方是1,2的平方是4...直到5的平方,25>17,所以一定是4点几的平方,所以等于4…

打家劫舍I 打家劫舍II (leetcode)

个人主页:Lei宝啊 愿所有美好如期而遇 打家劫舍Ihttps://leetcode.cn/problems/Gu0c2T/打家劫舍IIhttps://leetcode.cn/problems/PzWKhm/ 状态转移方程就是这样的: i位置选择偷f[i]:f[i] g[i-1] nums[i];i位置选择不偷g[i]:g…

C语言 指针——指针变量做函数参数:典型实例

目录 一个典型实例——两数互换 一个典型实例——两数互换 Errors

拓展虚拟世界边界,云手机可以做到吗

虚拟世界,AI,VR等词汇是21世纪最为流行的词汇,在科技背后,这些词汇的影响变得越来越大,已经走进了人们的世界,比如之前APPLE发布的vision pro,使人们能够更加身临其境的体验到原生os系统&#x…

存储 Bean 对象更加简单的方式

前置操作 如果是在 spring-config 中添加 bean 标签来注册内容,每个类都要弄一次就显得麻烦和臃肿了,对于 new 操作而言就没有什么优势了。因此 spring 就引入了注解操作来实现对 Bean 对象的存储。 配置扫描路径 想要将对象成功的存储到 Spring 中&…

【Linux系列】深入解析 `kill` 命令:Linux 下的进程管理利器

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

【每日力扣】32. 最长有效括号 416. 分割等和子集

🔥 个人主页: 黑洞晓威 😀你不必等到非常厉害,才敢开始,你需要开始,才会变的非常厉害 32. 最长有效括号 给你一个只包含 ( 和 ) 的字符串,找出最长有效(格式正确且连续)括号 子串 …

民国漫画杂志《时代漫画》第34期.PDF

时代漫画34.PDF: https://url03.ctfile.com/f/1779803-1248636026-7e46c5?p9586 (访问密码: 9586) 《时代漫画》的杂志在1934年诞生了,截止1937年6月战争来临被迫停刊共发行了39期。 ps: 资源来源网络!

亚马逊云科技峰会盛大举行 | 光环新网携光环云数据以高性能智算服务助力企业创新发展

2024年5月29日,云计算行业的年度盛典”2024亚马逊云科技中国峰会”在上海世博中心再次盛大启幕。作为全球领先的云计算服务提供商,亚马逊云科技峰会聚焦前沿科技,与来自不同行业、不同科技领域的优秀企业和用户共同探索AI时代的云端创新发展。…

mysql大表的深度分页慢sql案例(跳页分页)-2

1 背景 有一张大表,内容是费用明细表,数据量约700万级, 普通B树索引KEY idx_fk_fymx_qybh_xfsj (qybh,xfsj)。 1.1 原始深度分页sql select t.* from fk_fymx t where t.qybh XXXXXXX limit 100000,100; 深度分页会导致加载数据行过多1000001…

协方差矩阵如何能看出多元随机变量的分布情况

协方差矩阵可以通过以下几个方面帮助我们理解多元随机变量的分布情况: 变量的方差(对角线元素): 协方差矩阵的对角线元素表示各个变量的方差。方差反映了每个变量本身的离散程度。方差越大,表示该变量在其均值周围的波…

【计算机视觉(6)】

基于Python的OpenCV基础入门——图像的几何变换(2) 仿射变换透视变换仿射变化和透视变换的代码实现: 仿射变换 仿射变换是一种仅在二维平面中发生的几何变形,通俗的理解原来的直线变换之后还是直线,平行线变换之后还是…

[ubuntu18.04]搭建mptcp测试环境说明

MPTCP介绍 Multipath TCP — Multipath TCP -- documentation 2022 documentation 安装ubuntu18.04,可以使用虚拟机安装 点击安装VMware Tool 桌面会出现如下图标 双击打开VMware Tools,复制如下图所示的文件到Home目录 打开终端,切换到管…

100道面试必会算法-27-美团2024面试第一题-前缀和矩阵

100道面试必会算法-27-美团2024面试第一题-前缀和矩阵 问题解读 给定一个 n x n 的二进制矩阵,每个元素是 0 或 1。我们的任务是计算矩阵中所有边长为 k 的子矩阵中,包含特定数量 1 的情况。例如,我们希望找到所有边长为 k 的子矩阵中包含 k…

【面试八股总结】MySQL事务:事务特性、事务并行、事务的隔离级别

参考资料:小林coding 一、事务的特性ACID 原子性(Atomicity) 一个事务是一个不可分割的工作单位,事务中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。原子性是通过 undo …

Apache Druid 代码执行(CVE-2021-25646)漏洞复现

Druid简介与漏洞成因 Apache Druid是一个高性能的实时分析型数据库,旨在对大型数据集进行快速查询分析。Druid最常被当做数据库来用以支持实时摄取、高性能查询和高稳定运行的应用场景,同时,Druid也通常被用来助力分析型应用的图形化界面&am…

【方法】如何取消PPT“以只读方式打开“?

以“只读方式”打开的PPT,可能会受到不同的限制,比如无法编辑修改内容,无法保存原文件等。那如何取消PPT的“只读方式”呢?不同形式的“只读方式”,取消方法不同,下面一起来看看吧! “只读方式”…

达梦数据库(五) -------- 达梦数据库+mybatisPlus+springboot

前言:安装完达梦数据库后,需要初始化实例,在初始化实例时,需要注意大小写敏感的设置。大小写敏感只能在初始化数据库的时候设置,默认为大小写敏感,一旦设置成功就无法修改,如果想要修改&#xf…

景源畅信:抖音的爆款视频怎么选?

在短视频风起云涌的今天,抖音作为其中的佼佼者,每天都有无数视频在这里诞生。但如何在内容海洋中脱颖而出,成为人们茶余饭后谈论的焦点,是许多创作者和品牌思考的问题。选择爆款视频,不仅需要对平台规则有深刻理解&…