数据清洗
数据清洗
1 定义
数据清洗是从记录表、表格、数据库中检测、纠正或删除损坏或不准确记录的过程
专有名词
脏数据
未经过处理,自身含有一部分问题的数据
干净数据
完全符合要求的数据
2 基本流程
1 读取外部的数据 read_csv(读取txt以及csv文件)、read_excel(读取excel文件、)read_sql(从sql获取数据)、read_html(从网页获取数据)
2 数据概览(大概了解) index columns head tail shape describe info dtypes
3 简单处理 移除首尾空格 大小写转换
4 重复值处理 drop_duplicates()删除重复数据
h5 缺失值处理 删除或者填充
6 异常值处理 删除或是修正
7 字符串处理 切割、筛选
8 时间格式处理 时间格式是否正确
9 收尾处理 表格规范化处理
3 数据概览
文件.columns 查看字段是否符合规范,如字段首尾是否有空格
文件.info 查看数据的类型,比(文件.dtypes)更加全面
文件.describe 快速统计
文件.shape 查看行列数
文件.head/tail 查看首尾
4 简单处理
查看是否有无用的列,进行删除 文件.drop(colunms['字段名称'],inplace=True) 添加inplace=True 确认操作
列字段首尾空格处理 首先获取列字段的 变量名 = 文件名.columns.values 然后循环取出字段名,使用字符串的strip去除空格
5 去重
文件名.duplicated()可以判读是否重复,结果为bool值,重复为ture 可以用 文件名.duplicated().sum()对重复数据的数量进行统计
文件名[文件名.duplicated()] 布尔值索引,可以获取重复数据的详细数据
文件名.drop_duplicates(inplace=True) 删除重复数据
检查数据是否删除可以使用shape,对先后的行列数进行比较
6 数据填充
有些缺失的数据可以在其他列中找到,可以筛选出所需数据进行填充 方法 字符串的切片、字符串切割、正则筛选
文件名.isnull().sum() 统计每个字段缺失数据条数
文件名[文件名.字段名.isnull()] 利用布尔值索引筛选出相关字段有缺失的数据
使用相关方法筛选数据,并填充入空格
操作数据的列字段需要使用loc方法 列如 df.loc[df.出发地.isnull(),'出发地'] = [i.split('-')[0] for i in df.loc[df.出发地.isnull(),'路线名'].values]
无法找到可以采用其他公式进行填充,也可以选择删除
7 异常值处理
# 利用快速统计大致筛选出可能有异常数据的字段 # df.describe() # 价格小于节省 那么可能是价格有问题或者节省有问题 # 利用公式求证我们的猜想 sd = (df['价格'] - df['价格'].mean()) / df['价格'].std() # 判断的标准 # 利用逻辑索引筛选数据 df[(sd > 3)|(sd < -3)] # 利用绝对值 df[abs(sd) > 3] # abs就是绝对值的意思(移除正负号) # 同理验证节省是否有异常(不一定要使用) # sd1 = (df['节省'] - df['节省'].mean()) / df['节省'].std() # 判断的标准 # 利用逻辑索引筛选数据 # df[(sd > 3)|(sd < -3)] # 利用绝对值 # df[abs(sd1) > 3] # abs就是绝对值的意思(移除正负号) # 直接简单粗暴找节省大于价格的数据(推荐下列方式) df[df['节省'] > df['价格']] # 删除价格和节省都有异常的数据 # 方式1:先拼接 再一次性删除 # 横向合并pd.merge() # 纵向合并pd.concat() # res = pd.concat([df[df['节省'] > df['价格']],df[abs(sd) > 3]]) ## 获取要删除的行数据 索引值 # del_index = res.index # 根据索引删除数据 df.drop(index=del_index,inplace=True) # 再次重置索引 df.index = range(0,df.shape[0]) # 方式2: 得出一个结果就删一个
9 首尾操作
# 8.行索引会不会因为数据的删除而自动重置(删除完数据之后行索引是不会自动重置的) ## 如何获取表的行索引值 # df.index ## 右侧加上赋值符号就是修改行索引值 # df.index = range(0,df.shape[0]) df.tail()