当前位置: 首页 > 科技观察

如何使用Python清理数据?

时间:2023-03-18 14:39:29 科技观察

0。前言在做数据分析之前,首先要明确数据分析的目标,然后应用数据分析的思维对目标进行细分,并采取相应的行动。我们可以将数据分析细分为以下8个步骤:阅读清洗操作转换分析演示(8)报告在这篇《 如何用 Python 读取数据? 》中,我们学习了如何从5个不同的地方读取数据,然后接下来,我们将使用其中一个从Excel文件中读取原始数据,然后使用Python对其进行清理的方法。下面我们以一副待清理的扑克牌为例,假设与代码文件存放在同一个目录下,在JupyterLab环境下运行如下代码:importnumpyasnpimportpandasaspd#设置显示10行pd。set_option('max_rows',10)#从Excel文件中读取原始数据df=pd.read_excel('待清理的扑克牌数据集.xlsx')df返回如下结果:这张待清理的扑克牌数据集有一些异常情况,包括:size国王的花色缺失,有两个重复的黑桃:黑桃:A,和一个异常黑桃:黑桃:30。1.如何发现异常?在正式清洗数据之前,往往需要先将异常数据清洗出来,观察异常数据的特征,然后再决定清洗方式。#查找“花色”缺失的行df[df.suit.isnull()]#查找完全重复的行df[df.duplicated()]#查找某列中重复的行df[df.Number.duplicated()]#查找所有卡面的唯一值df.cardface.unique()returnresult:array(['bigking','littleking','A','30',4,5,6,7,8,9,10,'J','Q','K',2,3],dtype=object)根据常识可以判断牌面为30的牌是离群点.#找到包含30的“卡面”的异常值df[df.cardsurface.isin(['30'])]#找到王牌,模糊匹配df[df.cardsurface.str.contains('king',na=False)]#查找数字在1到5之间的行df[df.Number.between(1,5)]查找某个区间,也可以通过逻辑运算来实现:#查找1到5之间的数字linedf[(df.number>=1)&(df.number<=5)]其中“&”表示两边的条件必须同时满足,也就是“与”的意思。您还可以使用以下等效方法:#查找数字介于1和5之间的行df[~((df.number<1)|(df.number>5))]where"|"表示两边的条件都满足一个就够了,表示“或”,“~”表示否定,表示“不是”。2.如何排除重复项?使用drop_duplicates()函数,排除重复后,会得到一个新的数据框。#完全排除重复行,默认保留第一行df.drop_duplicates()返回结果如下:如果想改变原来的数据框,有两种方法,一种方法是增加inplace参数:#直接替换排除重复后原始数据框df.drop_duplicates(inplace=True)另一种方法是将得到的结果重新赋值给原始数据框:#排除重复后,重新赋值给原始数据框df=df.drop_duplicates()如果要按某列排除重复数据,只需指定相应的列名即可。#按某列排除重复项,默认保留第一行df.drop_duplicates(['color'])如果要保留最后一行重复项,需要指定keep参数。#排除某列重复,保留最后一行df.drop_duplicates(['color'],keep='last')从上面两个返回结果的数字可以看出不同方法的区别。3.如何删除丢失?使用dropna()函数,它默认删除包含missing的行。为了便于理解,我们以扑克牌中的不重复花色为例。#不重复的颜色color=df.drop_duplicates(['color'])color#删除包含缺失值的行color.dropna()如果要删除全部为空的行,需要指定how参数。#删除全部为空的行color.dropna(how='all')如果要删除包含缺失值的列,需要指定axis参数。#删除包含缺失值的列color.dropna(axis=1)可以看到包含缺失值的列“color”已经被删除了。4.遗漏的如何填写?使用fillna()函数,可以用我们指定的值填充缺失值。#补全缺失值color.fillna('Joker')可以看到原来的NaN被补成Joker了。在实际工作应用中,通常用0填充,也就是说fillna(0)是比较常见的用法。如果要使用相邻值填充,需要指定方法参数,例如:#Fillwiththefollowingvaluecolor.fillna(method='bfill')可以看到第一行原来的NaN是替换为第二行“黑桃:黑桃:”。其中,method还有一些其他的可选参数。具体请参考相关帮助文档。还有一种通过字典填充的方法。为了让下面的演示更加直观易懂,我们先将索引为2的卡面设置为缺失值:#为了演示,先指定一个缺失值color.loc[2,'cardface']=np.nancolor#press列自定义缺失值补全color.fillna({'suit':0,'cardface':1})可以看出不同列的缺失值可以用不同的值填充,花色栏填0,牌面栏填1,我在图中用红框标出。5.应用案例接下来我们使用Python代码将待清洗的扑克牌数据集转换为一组正常的扑克牌数据。importnumpyasnpimportpandasaspd#设置显示10行pd.set_option('max_rows',10)#从Excel文件中读取原始数据df=pd.read_excel('Pokerdatasettobecleaned.xlsx')#补全缺失值df=df.fillna('Joker')#排除重复值df=df.drop_duplicates()#修改异常值df.loc[4,'cardface']=3#添加缺失的卡片df=df.append({'number':4,'suit':'spades?','cardface':2},ignore_index=True)#按数字排序df=df.sort_values('number')#重置索引df=df.reset_index()#删除多余的列df=df.drop(['index'],axis=1)#将清洗后的数据保存到Excel文件中df.to_excel('扑克牌数据清洗完成.xlsx',index=False)df返回结果如下:可以看到,我们已经成功的将它转换成了一副普通的扑克牌数据。6.小结让我们简单回顾一下本文的主要内容。首先,我们从宏观层面介绍数据分析的8个步骤,然后以一组待清洗的扑克数据集为例,从读取数据到发现异常,再到排除重复、删除删除和完全删除,以及最后,我们用一个案例来充分展示清洗数据的过程。