数据分析师80%的时间都花在数据清洗上!
好的数据质量,应该满足“完全合一”
• 完整性:数据是否存在空值,字段是否完善,是否有漏掉
• 全面性:观察某一列的全部数值及特征值,是否存在单位、字段 名与数值不匹配
• 合法性:数据的类型、内容、大小的合法性。
• 唯一性:数据是否存在重复记录
问题1:缺失值
在数据中有些年龄、体重数值是缺失的,这往往是因为数据量较大,在过程中,有些数值没有采集 到。通常我们可以采用以下三种方法:
• 删除:删除数据缺失的记录;
• 均值:使用当前列的均值;
• 高频:使用当前列出现频率最高的数据。
比如我们想对df['Age']中缺失的数值用平均年龄进行填充,可以这样写: df['Age'].fillna(df['Age'].mean(), inplace=True)
问题2:空行
我们发现数据中有一个空行,除了 index 之外,全部的值都是 NaN。
Pandas 的 read_csv() 并没有可选参数来忽略空行,这样,我们就需要 在数据被读入之后再使用 dropna() 进行处理,删除空行。 # 删除全空的行 df.dropna(how= 'all' ,inplace=True)
问题3:列数据的单位不统一
weight列的数值,有的单位是千克 (kgs),有的单位是磅(lbs)。 这里统一将磅(lbs)转化为千克 (kgs): # 获取 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)
问题4:非ASCII字符
如果文本中存在非 ASCII 的字符。我 们还需要进行删除或者替换。 这里使用对非ASCII字符进行删除方式 # 删除非 ASCII 字符 df['name'].replace({r'[^\x00-\x7F]+':''}, regex=True, inplace=True
问题5:一列有多个参数(可选)
可以将Name分成last name + first name 也可以进行保留。 # 切分名字,删除源数据列 df[['first_name' , 'last_name']] = df['name'].str.split(expand=True) df.drop('name' , axis=1, inplace=True) 默认采用的空格进行分割,相当于df['name'].str.split(' ' , expand=True)
问题6:重复数据
我们校验一下数据中是否存在重复记 录。如果存在重复记录,就使用 Pandas 提供的 drop_duplicates() 来删 除重复数据。 # 删除重复数据行 df.drop_duplicates(['first_name' , 'last_name'],inplace=True)