【ML】数据清洗

之前听别人说,一个好的数据分析师80%的时间都花在数据清洗上,一个高质量的数据集才能支撑的了接下来的数据分析和应用。

什么是好的数据质量呢,我认为只要满足俩个方面就可以了:

1.完整:比如说 缺值少值,值不完整,NAN之类

2.合法:数据的类型,内容,大小是符合该特征的。比如,一个年龄的特征值不可能出现小数,也不可以是“张三”。

 

如何进行数据清洗:

填充

这一步通常用于处理缺失值。这是一个比较尴尬的问题,缺失值和的存在会使得数据稀疏,而补全值也会影响准确性。比如说,我们使用当前列的均值,或者使用当前列出现频率最高的数据用于处理,但是如果整个样本中老年人比较多,而缺失的这个人又是个婴儿,那么这个处理就和现实有偏差了。

#对年龄空值进行均值填充
df['Age'].fillna(df['Age'].mean(), inplace=True)

 

删除:

如果一列或者一行数据中只有NAN,NAN占了大多数,数据质量很差,那么我们可以把这一行删掉。

需要注意的一点是,pandas的read_csv()并没有可选参数来忽略空行,因此我们需要在数据读入进去以后再使用dropna()进行处理,删除空行。

#把空行删掉
df.dropna(how='all',inplace=True) 

或者遇到重复数据,比如一个人被记录了多次,可以把多余的数据删掉。

# 删除重复数据行
df.drop_duplicates(['first_name','last_name'],inplace=True)

 

替换:

比如,如有有一列的数据不合法,weight的数值哟肚饿单位是Kg,有的是lbs,那么就要统一单位。

# 获取 weight 数据列中单位为 lbs 的数据
rows_with_lbs = df['weight'].str.contains('lbs').fillna(False)
# 将 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字符。

# 删除非 ASCII 字符
df['name'].replace({r'[^\x00-\x7F]+':''}, regex=True, inplace=True)

 

拆列:

这个通常用于构造新的特征,比如方差,平均数等等,或者把有一列多参数分开。

比如把名字分成名和姓。

# 切分名字,删除源数据列
df[['first_name','last_name']] = df['name'].str.split(expand=True)
df.drop('name', axis=1, inplace=True)

 

posted on 2020-02-25 20:39  雪原那么远  阅读(283)  评论(0编辑  收藏  举报

导航