重磅干货,第一时间送达 作者:KOALA https://zhuanlan.zhihu.com/p/60241672 脏数据就是在物理上临时存在过,但在逻辑上不存在的数据。数据清洗是整个数据分析过程的第一步,就像做一道菜之前需要先择菜洗菜一样。数据分析师经常需要花费大量的时间来清洗数据或者转换格式,这个工作甚至会占整个数据分析流程的80%左右的时间。 在这篇文章中,我尝试简单地归纳一下用Python来做数据清洗的7步过程,供大家参考。 一、数据预处理 一、数据预处理
#导入数据分析包
2. 尝试去理解这份数据集 我们可以通过对数据集提问来判断这份数据能不能满足解答我们的问题,数据是否干净需不需要进一步处理,问题包括但不限于: 数据集多少数据? 3. 下面我们就结合代码来看一下数据 #1 从宏观一点的角度去看数据:查看dataframe的信息 也可以用这两条来看:
# 2.检查缺失数据
可以看到: 1)Country和UnitPrice都出现了NaN值,需要去掉 2)InvoiceDate的时间出现具体时分,可以删去 3)Description大概率是人工填写的数据,一般都会有比较多格式问题。 猜测会存在有标点符号掺杂/大小写不一致等问题,所以进一步这些人工填写数据的去重项拎出来研究一下 # 查看这个商品名称的去重项
发现有很多空格的问题 根据第一步数据预处理后,整理一下该数据集有下列问题需要处理: 1)调整数据类型:由于一开始用到了str来导入,打算后期再更换格式,需要调整数据类型。 2)修改列名:该数据的名称不易于理解,需要改列名 3)选择部分子集:因为有部分列在数据分析中不需要用到 4)可能存在逻辑问题需要筛选:比如Unit Price为负 5)格式一致化:Description可能会存在有标点符号掺杂/大小写不一致/空格重复出现等问题 6)消灭空值:CustomerID、Description、Country和UnitPrice都出现了NaN值,需要去掉 于是下面就开始后续的数据清洗6步 二、调整数据类型 #字符串转换为数值(整型)
![]() 三、修改列名 ![]() #建立字典字典:旧列名和新列名对应关系 ![]() 四、选择部分子集 这是一个8列*541909行的数据集。 ![]() ![]()
![]() #选择子集,选择其中两列 ![]() https://pandas./pandas-docs/stable/reference/api/pandas.DataFrame.loc.html#pandas.DataFrame.loc
以逗号作为隔开的界限,左边为index,右边为column
![]() ![]() subDataDF2=DataDF.loc[0:9,:] ![]() ![]()
![]() ![]()
还是Dataframe.loc这个函数的知识点。 由于loc还可以判断条件是否为True DataDF.loc[:,'UnitPrice']>0 ![]() ![]() 一般来说价格不能为负,所以从逻辑上来说如果价格是小于0的数据应该予以筛出
![]() 六、格式一致化
将我们数据中所有的Descrption改成大写: DataDF['Description']= DataDF['Description'].str.upper() 类似的代码还有 字符串修改方法:
2. 去除字符串符号 去乱码 3. 空格分割 #定义函数:分割InvoiceDate,获取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、去除缺失值 # 再一次提醒检查缺失数据 去除缺失值的知识点: DataFrame.dropna DataFrame.dropna(axis=0, how='any', thresh=None, subset=None, inplace=False)
2、填充缺失内容:某些缺失值可以进行填充,方法有以下四种: 1) 以业务知识或经验推测(默认值)填充缺失值 2) 以同一指标的计算结果(均值、中位数、众数等)填充缺失值 3) 用相邻值填充缺失值 4) 以不同指标的计算结果填充缺失值 去除缺失值的知识点: DataFrame.fillna https://pandas./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. 2) 以同一指标的计算结果(均值、中位数、众数等)填充缺失值 平均值- df.fillna(df.mean()) 使用数字类型的数据有可能可以通过这样的方法来去减少错误。 比如,这个案例里面的价格。如果用0或者'Not Given'等来去填充都不太合适,但这个大概的价格是可以根据其他数据估算出来的。
3)除此,还有一种常见的方法,就是用相邻的值进行填充, 这在时间序列分析中相当常见,用前面相邻的值向后填充,也可以用后面相邻的值向前填充。 print(DataDF) ![]() 4) 以不同指标的计算结果填充缺失值 关于这种方法年龄字段缺失,但是有屏蔽后六位的身份证号可以推算具体的年龄是多少。 参考来源: |
|
来自: LibraryPKU > 《机器学习》