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

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

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

一、数据预处理

一、数据预处理

  1. 部署环境,导入分析包和数据
#导入数据分析包
import pandas as pd
import 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​pandas.pydata.org

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)

六、格式一致化

  1. 大小写/去除空格

将我们数据中所有的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)

pandas.DataFrame.dropna - pandas 0.24.2 documentation​pandas.pydata.org

# 默认(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​pandas.pydata.org

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

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

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

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

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

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

pandas.DataFrame.fillna - pandas 0.24.2 documentation​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) 以不同指标的计算结果填充缺失值

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

参考来源:

张雨萌-酱油哥:给妹子讲python-S02E14Pandas缺失值的处理​zhuanlan.zhihu.com

陈丹奕:数据清洗的一些梳理​zhuanlan.zhihu.com

量子位:8个数据清洗Python代码,复制可用,最长11行 | 资源​zhuanlan.zhihu.com

python 去除字符串的标点符号 用_7步搞定数据清洗-Python数据清洗指南相关推荐

  1. python 去除字符串的标点符号 用_Python输入和输出

    点击上方Python知识圈,设为星标 回复1024获取Python资料 阅读文本大概需要 5 分钟 近期精彩文章:Python100例(附PDF下载地址) 在很多时候,你会想要让你的程序与用户(可能是 ...

  2. [转载] [转载] python 去除字符串的标点符号 用_Python成为专业人士笔记–String字符串方法

    参考链接: Python字符串| 十六进制 hexdigits 参考链接: Python的字符串Strings decode "专业人士笔记"系列目录: 创帆云:Python成为专 ...

  3. [转载] python 去除字符串的标点符号 用_Python成为专业人士笔记–String字符串方法

    参考链接: Python的字符串Strings decode "专业人士笔记"系列目录: 创帆云:Python成为专业人士笔记--强烈建议收藏!每日持续更新!​zhuanlan.z ...

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

    脏数据就是在物理上临时存在过,但在逻辑上不存在的数据. 数据清洗是整个数据分析过程的第一步,就像做一道菜之前需要先择菜洗菜一样.数据分析师经常需要花费大量的时间来清洗数据或者转换格式,这个工作甚至会占 ...

  5. python数据清洗的方法有哪些_7步搞定数据清洗-Python数据清洗指南

    作者:KOALA https://zhuanlan.zhihu.com/p/60241672 脏数据就是在物理上临时存在过,但在逻辑上不存在的数据. 数据清洗是整个数据分析过程的第一步,就像做一道菜之 ...

  6. 【Python selenium自动化环境配置】4步搞定ChromeDriver版本选择

    很多刚做自动化的小伙伴,会在ChromeDriver版本选择时犯难,看来大家都被坑过,真正掌握独门绝技,都不是难事儿. 看好了主要步骤就4部 1.确定谷歌浏览器版本 2.找到谷歌浏览器版本与Chrom ...

  7. python去除字符串中表情字符

    python去除字符串中表情字符 用mysql存储数据时,"charset=utf8"默认状态下text字段不支持4字节的字符,而表情字符为4字节,如果表情字符非所需数据时可以将其 ...

  8. python去掉两边空格,Python去除字符串两端空格的方法

    这篇文章主要介绍了Python去除字符串两端空格的方法,本文主要讲解了string.lstrip.string.rstrip.string.strip等函数的运用,需要的朋友可以参考下 目的 获得一个 ...

  9. Python 去除字符串中空格(删除指定字符)的3种方法

    文章目录 Python 去除字符串中空格 Python strip()方法 Python lstrip()方法 Python rstrip()方法 Python 去除字符串中空格 用户输入数据时,很有 ...

最新文章

  1. Cosmos互联链通信技术规范(上)
  2. gcc oracle mysql_[转]Windows下用GCC连接MySQL数据库
  3. gnuplot读取mysql数据库_Tpcc-MySQL测试并使用gnuplot生成图表
  4. RAP框架练习(续)
  5. 2023计算机毕业设计SSM最新选题之javaAI学院教务信息管理系统lx9v9
  6. java 邮件批量发送邮件_利用Java实现电子邮件的批量发送
  7. 行行出状元,大学毕业生卖煎饼月入13万
  8. 计算机图形学课程设计内容及要求
  9. 最近程序员频繁被抓,如何避免面向监狱编程!?
  10. 莫纳什大学计算机专业录取要求,2020年莫纳什大学计算机信息硕士申请条件
  11. 公钥证书的颁发和使用
  12. rstudio的数据集怎么建立和保存_在R Studio中保存
  13. 未来链上跨境支付、融资领域龙头 Tribal 的发展与机遇
  14. 实习生招聘--CVTE笔试【1】
  15. 实现将网页多条磁力链接一次性全部下载
  16. 安居客冲刺上市:姚劲波全力支持,距离贝壳找房还差6个我爱我家
  17. 车辆清洗系统-全自动洗车机-龙门清洗系统-自助洗车系统-自动洗车机解决方案
  18. http无状态还是web应用无状态
  19. 基于AR的实时算法在虚拟屏幕上播放视频及实现
  20. DECLARE CURSOR FOR的使用

热门文章

  1. C# 特性(attribute)
  2. 整理前端css/js/jq常见问题及解决方法(3)
  3. (转)Engineering Productivity
  4. 第三十二讲 ASP.NET网络打印
  5. 21.单链表怎么就地逆序?
  6. C#版本与.NET版本对应关系以及各版本的特性
  7. 五种计算机编程语言注定要衰落,牛逼的你怎么看呢???
  8. OpenCV3编程入门(毛星云)之用滚动条控制两图片的混合
  9. opencv打开摄像头采集和保存
  10. 数据库本地服务器为空,本地搭建的服务器访问不到数据库数据