之前听别人说,一个好的数据分析师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)