数据清洗是什么
数据清洗就是指发现并纠正数据文件中可识别的错误的最后一道程序,包括检查数据一致性,处理无效值和缺失值等。
数据清洗规则
数据清洗有四个关键点。
完整性
单条数据是否存在空值,统计的字段是否完善
全面性
观赏某一列的全部数值,我们可以通过比较最大值,最小值,平均值,数据定义等来判断数据是否全面
合法性
数值的类型、内容、大小是否符合我们设定时候的预想。例如:人类年龄超过1000岁,这个数据就是不合法的。
唯一性
数据是否重复记录,例如:一个人的数据被重复记录多次。
我们清理数据的标准是使得数据标准,干净,连续。
数据清洗方案
例子(极客时间截图):
完整性
缺失值
遇到数据有缺失值的,我们可以采用以下方法:
- 删除:删除缺失的记录
- 均值:使用当前列的均值
- 高频:使用当前列出现频率最高的数据
例子:我们对上图中Age(2)列中缺失的数值用平均值填充:
df['Age'].fillna(df['Age'].mean(), inplace=True)
如果我们用高频数据填充,可以先取得高频值,然后再填充:
age_maxf = train_features['Age'].value_counts().index[0]
train_features['Age'].fillna(age_maxf, inplace=True)
空行
商标中有一个空行数据,除了index其余都是NaN。我们需要删除空行:
# 删除全空的行
df.dropna(how='all',inplace=True)
全面性
列数据的单位不统一
观察weight(3)列。weight列的单位不统一,有kg也有lbs
我们统一使用kg,将lbs转化为kg:
# 获取 weight 数据列中单位为 lbs 的数据
rows_with_lbs = df['weight'].str.contains('lbs').fillna(False)
print df[rows_with_lbs]
# 将 lbs 转换为 kgs, 2.2lbs=1kgs
for i,lbs_row in df[rows_with_lbs].iterrows():
# 截取从头开始到倒数第三个字符之前,即去掉 lbs。
weight = int(float(lbs_row['weight'][:-3])/2.2)
df.at[i,'weight'] = '{}kgs'.format(weight)
合理性
非ASCII字符
姓名列(1)有一些非ASCII字符,我们可以采用删除或替换的方式解决非ASCII问题,我们使用删除方法:
# 删除非 ASCII 字符
df['first_name'].replace({r'[^\x00-\x7F]+':''}, regex=True, inplace=True)
df['last_name'].replace({r'[^\x00-\x7F]+':''}, regex=True, inplace=True)
唯一性
一列有多个参数
我们将姓名列(1)拆分为姓和名两个字段。我们使用python中的split方法,str.split(expand=True)
将列表拆分,再将原来的Name列删除:
# 切分名字,删除源数据列
df[['first_name','last_name']] = df['name'].str.split(expand=True)
df.drop('name', axis=1, inplace=True)
重复数据
我们校验一下是否存在重复数据,如果存在重复数据,就使用pandas提供的drop_duplicates()来删除:
# 删除重复数据行
df.drop_duplicates(['first_name','last_name'],inplace=True)