作者|刘顺祥源|数据分析1480数据分析过程中最麻烦的部分是探索和清洗——探索的目的是理解数据,理解数据背后隐藏的规律;清洗的目的是让干净的数据进入下一个分析或建模环节。小编将通过三篇文章详细讲解工作中常规的数据清洗方法,包括数据类型转换、重复数据处理、缺失值处理、异常数据识别处理。这是Python数据清洗系列的第一篇文章。分享的主要内容包括——数据类型转换和冗余数据识别处理数据类型判断和转换,如下表所示,为个人信息和交易数据,涉及的字段有用户id、性别、年龄、学历级别、交易金额和交易日期。表面上看数据背后似乎没有可能存在的问题,所以读入Python,通过探索发现数据中的问题。读取数据,检查数据大小,检查数据中各个变量的数据类型的代码如下:#导入第三方包importpandasaspd#读入外部数据data3=pd.read_excel(io=r'C:\Users\Administrator\Desktop\datas\data3.xlsx')#查看数据的规模data3.shapeout:(3000,6)#查看表中各个变量的数据类型#data3.dtypesout:表中各变量的数据类型如下表所示:上述代码使用shape“方法”返回数据集的大小,即数据包含3000行6列;通过dtypes“方法”,它返回数据集中每个变量的数据类型——id变量和age变量除外。数值型,其他变量都是字符型。直观上能感觉到一点问题,就是数据类型不对。比如用户id应该是字符类型,消费金额custom_amt应该是数字类型,订单日期应该是日期类型。如果发现数据类型不对,如何借助Python工具实现数据类型转换呢?可以参考下面代码的实现。#数值转字符data3['id']=data3['id'].astype(str)#字符转数值data3['custom_amt']=data3['custom_amt'].str[1:]。astype(float)#字符类型到日期类型data3['order_date']=pd.to_datetime(data3['order_date'],format='%YYear%mMonth%dDay')#查看数据集Typedata3的变量。dtypesout:这些数据经过处理后,各字段的数据类型如下表所示:如上结果所示,三个变量都转换成了自己期望的数据类型。astype“方法”用于数据类型的强制转换,可以选择的常见转换类型包括str(表示字符类型)、float(表示浮点类型)和int(表示整数类型)。由于消费金额custom_amt变量中的值中含有人民币符号“¥”,因此必须在数据类型转换前将其删除(通过字符串切片方式删除,[1:]表示从字符串的第二个元素开始截断)。对于character-to-date问题,推荐使用更灵活的to_datetime函数,因为在format参数的调整下,它可以识别任何格式的字符日期值。需要注意的是,Python中的函数有两种表现形式,一种是常规理解下的函数(语法是func(parameters),比如to_datetime函数),另一种是“方法”(语法是obj.func(参数),例如dtypes和astype“方法”)。两者的区别在于“方法”是针对特定对象的函数(即“方法”只能用在固定类型的对象上),而函数则没有这种限制。根据以上类型的转换结果,最后浏览数据的显示形式:#预览前5行数据data3.head()冗余数据的判断和处理以上过程就是对各个变量类型的判断和转换在数据中。还需要监控表中是否存在“脏”数据,如冗余重复观测值、缺失值等。“脏”数据的识别和处理可以通过复制“方法”来进行。仍以对上述data3数据进行操作为例,具体代码如下。#判断数据中是否存在重复观测data3.duplicated().any()out:False如果上述结果返回False,说明数据集中不存在重复观测。如果读者使用上述代码在数据集中查找重复的观测值,可以使用drop_duplicates“方法”删除冗余信息。需要注意的是,使用duplicated“方法”判断数据行是否重复时,会返回一个与原始数据行数相同的序列(如果数据行不重复则对应False,否则它会对应True),为了得到最终的判断结果,需要使用任何“方法”(即只要序列中有True,就会返回True)。duplicated“方法”和drop_duplicates“方法”都有一个很重要的参数,就是subset。默认情况下,不设置该参数时,表示重复判断数据的所有列;如果需要根据指定的变量进行数据重复性判断,可以使用该参数指定具体的变量列表。例子如下:#构造数据df=pd.DataFrame(dict(name=['张三','李四','王二','张三','赵武','丁一','王二'],gender=['男','男','女','男','女','女','男'],age=[29,25,27,29,21,22,27],income=[15600,14000,18500,15600,10500,18000,13000],edu=['本科','本科','硕士','本科','学院','本科','master']))#查看数据df,目测有两条相同的数据,是用户张三。如果不修改任何参数,直接使用drop_duplicates“方法”,将删除第二次出现的用户张三。代码如下:#默认判断数据的所有变量df.drop_duplicates()假设在数据清洗中,用户姓名和年龄相同,认为是重复数据,那么如何进行duplicate基于这两个变量的值删除?此时需要用到subset参数,代码如下:df.drop_duplicates(subset=['name','age'])需要注意的是,使用drop_duplicates“方法”删除重复数据确实不直接影响原始数据。也就是说,原始数据中仍然存在重复观察。为了使drop_duplicates“方法”的drop函数作用于原始数据,必须将inplace参数设置为True。本期内容就介绍到这里,下篇文章会分享缺失值的识别和处理技巧。扫描二维码进入CDA官方小程序,解锁更多新鲜资讯和优质内容,还有免费试听课程,不要错过!
