pandas用众数填充缺失值_7步搞定数据清洗-Python数据清洗指南

脏数据就是在物理上临时存在过,但在逻辑上不存在的数据。

数据清洗是整个数据分析过程的第一步,就像做一道菜之前需要先择菜洗菜一样。数据分析师经常需要花费大量的时间来清洗数据或者转换格式,这个工作甚至会占整个数据分析流程的80%左右的时间。

在这篇文章中,我尝试简单地归纳一下用Python来做数据清洗的7步过程,供大家参考。

一、数据预处理

一、数据预处理

部署环境,导入分析包和数据

#导入数据分析包

import pandas as pdimport numpy as np

#导入csv数据

#dtype = str,最好读取的时候都以字符串的形式读入,不然可能会使数据失真#比如一个0010008的编号可能会读取成10008fileNameStr = './Actual transactions from UK retailer.csv'DataDF = pd.read_csv(fileNameStr,encoding = "ISO-8859-1",dtype = str)# encoding = "ISO-8859-1" -- 用什么解码,一般会默认系统的编码,如果是中文就用 "utf-8"DataDF = pd.read_csv(fileNameStr,encoding = "utf-8",dtype = str)

2. 尝试去理解这份数据集

我们可以通过对数据集提问来判断这份数据能不能满足解答我们的问题,数据是否干净需不需要进一步处理,问题包括但不限于:数据集多少数据?包含了什么字段?字段格式是什么?字段分别代表什么意义字段之间的关系是什么?可以用做什么分析?或者说能否满足了对分析的要求?有没有缺失值;如果有的话,缺失值多不多?现有数据里面有没有脏数据?尤其需要注意人工输入的数据,经常会出现名称写错,多输入空格等等的情况

3. 下面我们就结合代码来看一下数据

#1 从宏观一点的角度去看数据:查看dataframe的信息

DataDF.info()

也可以用这两条来看:

#1.1查看每一列的数据类型

DataDF.dtypes#1.2有多少行,多少列DataDF.shape

# 2.检查缺失数据

# 如果你要检查每列缺失数据的数量,使用下列代码是最快的方法。# 可以让你更好地了解哪些列缺失的数据更多,从而确定怎么进行下一步的数据清洗和分析操作。DataDF.isnull().sum().sort_values(ascending=False)

# 3.是抽出一部分数据来,人工直观地理解数据的意义,尽可能地发现一些问题

DataDF.head()

可以看到:

1)Country和UnitPrice都出现了NaN值,需要去掉

2)InvoiceDate的时间出现具体时分,可以删去

3)Description大概率是人工填写的数据,一般都会有比较多格式问题。

猜测会存在有标点符号掺杂/大小写不一致等问题,所以进一步这些人工填写数据的去重项拎出来研究一下

# 查看这个商品名称的去重项

DataDF['Description'].unique()

# 设置输出全部的内容

# threshold就是设置超过了多少条,就会呈现省略#(比如threshold=10的意思是超过10条就会省略)np.set_printoptions(threshold=np.inf)

发现有很多空格的问题

根据第一步数据预处理后,整理一下该数据集有下列问题需要处理:

1)调整数据类型:由于一开始用到了str来导入,打算后期再更换格式,需要调整数据类型。

2)修改列名:该数据的名称不易于理解,需要改列名

3)选择部分子集:因为有部分列在数据分析中不需要用到

4)可能存在逻辑问题需要筛选:比如Unit Price为负

5)格式一致化:Description可能会存在有标点符号掺杂/大小写不一致/空格重复出现等问题

6)消灭空值:CustomerID、Description、Country和UnitPrice都出现了NaN值,需要去掉

于是下面就开始后续的数据清洗6步

二、调整数据类型

数据类型调整前

#字符串转换为数值(整型)

DataDF['Quantity'] = DataDF['Quantity'].astype('int')#字符串转换为数值(浮点型)DataDF['UnitPrice'] = DataDF['UnitPrice'].astype('float')

日期调整前(为求简便这里用已经剔除分秒,剔除的办法后面在格式一致化的空格分割再详细说)

#数据类型转换:字符串转换为日期

#errors='coerce' 如果原始数据不符合日期的格式,转换后的值为空值NaTDataDF.loc[:,'InvoiceDate']=pd.to_datetime(DataDF.loc[:,'InvoiceDate'],format='%d/%m/%Y',errors='coerce')#!!⚠️ format 是你[原始数据]中日期的格式%y 两位数的年份表示(00-99)%Y 四位数的年份表示(000-9999)%m 月份(01-12)%d 月内中的一天(0-31)%H 24小时制小时数(0-23)%I 12小时制小时数(01-12)%M 分钟数(00-59)%S 秒(00-59)

日期类型调整后

数据类型调整完毕

三、修改列名

修改前

#建立字典字典:旧列名和新列名对应关系

colNameDict = {'InvolceDate':'SaleDate','StockCode':'StockNo'}#!! ⚠️一定要旧列名放在冒号前#每组对应关系以[逗号]隔开salesDf.rename(columns = colNameDict,inplace=True)

修改后

四、选择部分子集

这是一个8列*541909行的数据集。

#选择子集,选择其中一列

subDataDF1=DataDF["InvoiceDate"]

#选择子集,选择其中两列

subDataDF1=DataDF[["InvoiceDate","UnitPrice"]]

利用切片筛选 数 据功能 df.loc

https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.loc.html#pandas.DataFrame.loc

loc这个代码有点像Excel里面的鼠标左键,可以随意拉动你需要的数据进行切片。

以逗号作为隔开的界限,左边为index,右边为column

subDataDF1=DataDF.loc[:,"InvoiceDate"]

subDataDF1#单一个冒号意味着不作限制的全选

subDataDF2=DataDF.loc[0:9,:]

subDataDF2

subDataDF3=DataDF.loc[1:9,"StockCode":"CustomerID"]

subDataDF3

五、逻辑问题需要筛选

还是Dataframe.loc这个函数的知识点。

由于loc还可以判断条件是否为True

DataDF.loc[:,'UnitPrice']>0

一般来说价格不能为负,所以从逻辑上来说如果价格是小于0的数据应该予以筛出

#删除异常值:通过条件判断筛选出数据

#查询条件querySer=DataDF.loc[:,'Quantity']>0#应用查询条件print('删除异常值前:',DataDF.shape)DataDF=DataDF.loc[querySer,:]print('删除异常值后:',DataDF.shape)

六、格式一致化

大小写/去除空格

将我们数据中所有的Descrption改成大写:

DataDF['Description']= DataDF['Description'].str.upper()

类似的代码还有 字符串修改方法:

str().

upper()lower()title()lstrip()strip()DataDF['Description']= DataDF['Description'].str.strip()

2. 去除字符串符号 去乱码

3. 空格分割

#定义函数:分割InvoiceDate,获取InvoiceDate

#输入:timeColSer InvoiceDate这一列,是个Series数据类型#输出:分割后的时间,返回也是个Series数据类型def splitSaletime(timeColSer):timeList=[]for value in timeColSer:#例如2018/01/01 12:50,分割后为:2018-01-01dateStr=value.split(' ')[0]timeList.append(dateStr)#将列表转行为一维数据Series类型timeSer=pd.Series(timeList)return timeSer

最后再赋值回去

DataDF.loc[:,'InvoiceDate']=splitSaletime(DataDF.loc[:,'InvoiceDate'])

七、处理缺失值

python缺失值有3种:

1)Python内置的None值

2)在pandas中,将缺失值表示为NA,表示不可用not available。

3)对于数值数据,pandas使用浮点值NaN(Not a Number)表示缺失数据。后面出来数据,如果遇到错误:说什么float错误,那就是有缺失值,需要处理掉

所以,缺失值有3种:None,NA,NaN

那None和NaN有什么区别呢:

None是Python的一种数据类型,

NaN是浮点类型

两个都用作空值

1、去除缺失值

# 再一次提醒检查缺失数据

DataDF.isnull().sum().sort_values(ascending=False)

去除缺失值的知识点:

DataFrame.dropna

DataFrame.dropna(axis=0, how='any', thresh=None, subset=None, inplace=False)

# 默认(axis=0)是逢空值剔除整行,设置关键字参数axis=1表示逢空值去掉整列

# 'any'如果一行(或一列)里任何一个数据有任何出现Nan就去掉整行,‘all’一行(或列)每一个数据都是Nan才去掉这整行DataDF.dropna(how='any')DataDF.dropna(how='all')# 更精细的thresh参数,它表示留下此行(或列)时,要求有多少[非缺失值]DataDF.dropna(thresh = 6 )

2、填充缺失内容:某些缺失值可以进行填充,方法有以下四种:

1) 以业务知识或经验推测(默认值)填充缺失值

2) 以同一指标的计算结果(均值、中位数、众数等)填充缺失值

3) 用相邻值填充缺失值

4) 以不同指标的计算结果填充缺失值

去除缺失值的知识点:

DataFrame.fillna

https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.fillna.html#pandas.DataFrame.fillna

1) 用默认值填充- df.fillna(' ')

我们应该去掉那些不友好的 NaN 值。但是,我们应该用什么值替换呢?这个时候可能要结合你对这个数据集的理解,看填充什么数据才是比较合适,以下是一下常用的方法。

在这个数据集中,我们大致判断CustomerID如果是不太重要的,就我们可以用使用""空字符串或其他默认值。

DataDF.Country= DataDF.Country.fillna('Not Given')

上面,我们就将“country”整个列使用“”空字符串替换了,或者,我们也可以轻易地使用“Not Given”这样的默认值进行替换。

如果想了解更多 fillna() 的详细信息参考 pandas.DataFrame.fillna

pandas.pydata.org

2) 以同一指标的计算结果(均值、中位数、众数等)填充缺失值

平均值- df.fillna(df.mean())

使用数字类型的数据有可能可以通过这样的方法来去减少错误。

比如,这个案例里面的价格。如果用0或者"Not Given"等来去填充都不太合适,但这个大概的价格是可以根据其他数据估算出来的。

DataDF.UnitPrice = DataDF.UnitPrice.fillna(DataDF.UnitPrice.mean())

3)除此,还有一种常见的方法,就是用相邻的值进行填充,

这在时间序列分析中相当常见,用前面相邻的值向后填充,也可以用后面相邻的值向前填充。

print(DataDF)

print(DataDF.UnitPrice.fillna(method='ffill')) # 前向后填充print(DataDF.UnitPrice.fillna(method='bfill')) # 后向前填充

填充后

4) 以不同指标的计算结果填充缺失值

关于这种方法年龄字段缺失,但是有屏蔽后六位的身份证号可以推算具体的年龄是多少。

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

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

相关文章

有盘和无盘服务器,网吧系统的终极解决之道:无盘系统+有盘(转)

1、效果好:系统启动飞速,玩大型游戏飞速,不会丢失账号,系统永远干净。2、不会中毒:系统文件从服务器上的镜像中读取,大型游戏从本地硬盘读取,本地硬盘全盘还原,游戏穿透更新。3、投资…

Sigma IDE现在支持Python无服务器Lambda函数!

想想无服务器,使用Pythonic –全部在您的浏览器中! (好吧,这则新闻已经过了几周了,但是仍然……) 如果您沉迷于整个无服务器的“事物”中 ,您可能已经注意到我们,一个在SLAppForge臭…

微信分享 ajax冲突,微信jssdk分享功能开发及解决ajax跨域的问题

微信JS-SDK说明文档微信JS-SDK Demo我所要实现的分享功能要求:只要提供一段js代码给前端美工放置在静态页面等就可以实现分享功能。js代码如下:urllocation.href;$.ajax({type : "get",url : "http://域名/wx/test/jssdk.php?url"u…

idle不是python自带的开发工具_Python的开发工具

通常情况下,为了提高开发效率,需要使用相应的开发工具。进行Python开发也可以使用开发工具。下面将详细介绍Python自带的IDLE 一使用自带的IDLE 在安装Python后,会自动安装一个IDLE。它是一个Python shell(可以在打开的IDLE窗口的标题栏上看到…

合肥工业大学机器人技术期末_机器人技术第三次作业(HFUT)

第三次作业本人代码水平十分有限,仅供参考,有错误请指出java源码:package robathomework3;import java.lang.Math;//点类class point {double x 0;double y 0;point(double x, double y) {this.x x;this.y y;}void print() {System.out.p…

java se 导原码_Java SE 8新功能导览:Java开发世界中的重大变化

java se 导原码我很自豪,像其他专业团队成员一样,是采用OpenJDK的成员之一,但是从过去8个月就加入了,我们经历了Java SE 8 开发,编译,编码,讨论等各个阶段,直到将其付诸实践为止。 。…

linux将日期和日历信息追加到文件中_Linux任务调度

crontab 任务调度crontab 进行定时任务的设置概述 任务调度:是指系统在某个时间执行的特定的命令或程序。任务调度分类:1.系统工作:有些重要的工作必须周而复始地执行,如病毒扫描等 。2.个别用户工作:个别用户可能希望…

android sdk build-tools_从零开始仿写一个抖音App——视频编辑SDK开发(一)

本文首发于微信公众号——世界上有意思的事,搬运转载请注明出处,否则将追究版权责任。交流qq群:859640274。大家好久不见,又有一个多月没有发文章了。不知道还有哪些读者记得我的 从零开始仿写抖音App 的系列文章,这个…

爱默生E系列服务器机柜托盘,艾默生通信电源PS48300-3B/1800 一体化室内机柜

PS48300-3B/1800电源系统PS48300-3B/1800电源系统是艾默生网络能源集多年开发和网上运行经验,采用 DSP控制技术,为满足3G网络需求而设计的高可靠、高功率密度、高性能、全数 字化通信电源系统。根据交流配电和机柜高度。一、特点 1、休眠节能专利技术&am…

功能Java示例 第8部分–更多纯函数

这是第8部分,该系列的最后一部分称为“ Functional Java by Example”。 我在本系列的每个部分中发展的示例是某种“提要处理程序”,用于处理文档。 在上一期文章中,我们已经使用Vavr库看到了一些模式匹配,并且还将故障也视为数据…

tensorflow 小于_坐姿不对,屏幕就变模糊!教你用TensorFlow做一款“隐形背背佳”...

大数据文摘出品作为一个上班族,每天坐在电脑前那么久,难免出现腰酸背痛的情况,时间长了甚至脊柱都歪曲变形了,这可不行!一定要克制住自己的坐姿。这里有款“隐形背背佳”,要不要了解一下?一位名…

python处理csv文件列错位_CSV文件分割与列异常处理的python脚本

#codingutf-8 ‘‘‘脚本说明 用来解决csv文件的列异常问题(以逗号分隔符为例): csv文件有些列含有换行符、逗号等特殊符号,这就导致csv文件出现列异常的情况。 此脚本将csv文件输出成如下文件:源文件名-正确列-文件序…

文本分类和提取关键词算法_文本内容之间的关键词提取和相似度计算

文本分类和提取关键词算法背景 Web应用程序变得越来越智能。 从网站上使用服务的日子已经一去不复返了,用户不得不填写一个巨大的表格。 假设您有一个适合书迷的网站。 在Web 2.0之前,像这样的网站曾经以诸如年龄,阅读的书籍,喜欢…

python里随机抽取样本_概率分布和抽样分布基础知识及Python实现

本文主要介绍推论统计中的概率分布和抽样分布,本文结构如下: 一、概率分布 随机变量:在一定条件下,某件事情可能发生或者不发生,这个事件就叫随机事件。例如抛硬币哪面朝上。随机变量X就是用来量化随机事件的函数,是将随机事件每一个可能出现的结果映射到数值的一个函数。…

php 创建目录_使用SMB绕过PHP远程文件包含限制

译文声明本文是翻译文章,文章原作者mannulinux,文章来源:mannulinux.org 原文地址:http://www.mannulinux.org/2019/05/exploiting-rfi-in-php-bypass-remote-url-inclusion-restriction.html译文仅供参考,具体内容表达…

eas系统服务器地址,EAS7.0EAS7.5服务端及其客户端标准配置介绍

金蝶EAS是基于JavaEE的大型企业应用。目前服务端支持以下主流软硬件环境。适用版本:EAS7.0 EAS703 EAS7.51.金蝶EAS服务端支持的软硬件环境注:标志为部署支持的环境,可以正常安装配置,但是正式运行前需联系金蝶技术支持。2.客户端…

Java的Kafka:构建安全,可扩展的消息传递应用程序

使用Okta的身份管理平台轻松部署您的应用程序 使用Okta的API在几分钟之内即可对任何应用程序中的用户进行身份验证,管理和保护。 今天尝试Okta。 当今的用户希望可以通过其计算机,手机,平板电脑或任何其他设备访问您的应用程序! …

background复合属性顺序_CSS有哪些好用的字体属性?

本文创建于2020年9月,以下为正文:CSS中有哪些字体属性呢?font:复合属性。设置或检索对象中的文本特征。font-style:设置或检索对象中的字体样式。用于定义字体的风格,如:斜体(italic…

转译和编译_10个有趣又能编译为JavaScript的语言,你用过哪些?

点击上方“IT平头哥联盟”,选择“置顶或者星标”你的关注意义重大!来源:https://www.sitepoint.com/现代应用相比普通的网页有不同的要求。但是浏览器是一个有着一套(大部分)固定可用的技术的平台,JavaScript依然是web应用的核心语…

OPC服务器如何采集设备的信息,如何将OPC服务器采集的设备数据转为MQTT方式,实现云端发布或订阅...

通过与PLC、智能仪表等硬件设备,以及OPC服务器、数据库等软件建立通讯,进行实时数据采集监控,然后将相关数据转换为数据库、OPC,以及MQTT、HTTP等多种服务接口,实现各类自动化与信息化系统软件灵活对接。MQTT智能网关案…