11 数据清洗
在数据分析过程中,数据清洗在时间上占到了80%。
数据质量的准则(“完全合一”)
(1)完整性:单条数据是否存在空值,统计的字段是否完善。
(2)全面性:观察某一列的全部数值,通过常识来判断该列是否有问题。
(3)合法性:数据的类型、内容、大小的合法性。
(4)唯一性:数据是否存在重复记录
数据清理要使数据标准、赶紧、连续,为后续数据统计、数据挖掘做好准备。
1、完整性
问题1:缺失值
解决办法:①删除 ②均值 ③高频
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) #高频值
问题2:删除空行
# 删除全空的行(除了index外,其他都是空值)
df.dropna(how='all',inplace=True)
2.全面性
问题:列数据的单位不统一
# 获取 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)
3.合理性
问题:非ASCII字符
# 删除非 ASCII 字符
df['first_name'].replace({r'[^\x00-\x7F]+':''}, regex=True, inplace=True)
df['last_name'].replace({r'[^\x00-\x7F]+':''}, regex=True, inplace=True)
4.唯一性
问题1:一列有多个参数
# 切分名字,删除源数据列
df[['first_name','last_name']] = df['name'].str.split(expand=True)
df.drop('name', axis=1, inplace=True)
问题2:重复数据
# 删除重复数据行
df.drop_duplicates(['first_name','last_name'],inplace=True)