第十一讲 数据清洗

数据采集完,要进行数据清洗工作,整个数据分析过程中,数据清洗工作几乎要占到80%的时间。

数据质量的准则

数据清洗规则总结为四个关键点:“完全合一”。
1、完整性:单条数据是否存在空值,统计的字段是否完善。
2、全面性:观察某一列的全部数值,比如平均值、最大值、最小值,根据常识判断是否有问题。如:数据定义、单位标识、数值本身。
3、合法性:数据的类型、内容、大小的合法性。如:存在非ASCII字符、性别未知、年龄过高等等。
4、唯一性:数据是否重复记录,行数据及列数据都要是唯一的。

使用Pandas来进行数据的清洗

1、完整性

问题1: 缺失值
df1.isnull().any() #判断哪列有空值
因为数值量较大,有些数据没有采集到,可以采用以下三种方法:

  • 删除:删除数据缺失的记录
  • 均值:使用当前列的均值(df[‘Age’].fillna(df[‘Age’].mean),inplace=True))
  • 高频:使用当前列出现频率最高的数据(age_max=df[‘Age’].value_counts().index[0] df[‘Age’].fillna(age_max,inplace=True))

问题2:空行

#删除全空的行
df.dropna(how='all',inplace=True)

2、全面性

问题:列单位不统一
一个数据表如下:
在这里插入图片描述
表中体重与身高的单位不一致。需进行转换,代码如下:

import pandas as pd
df1=pd.read_excel("C:\\Users\\五月\\Desktop\\test\\test.xlsx")
rows_with_jins=df1['体重'].str.contains('jin').fillna(False)

for i,jin_row in df1[rows_with_jins].iterrows(): #iterrows()属于DataFrame(数据框)的遍历函数
    weight=int(float(jin_row['体重'][:-3])/2) #这里有字符串到float再到int的转换
    df1.at[i,'体重']='{}kg'.format(weight) #at[index,column]获取某个位置的值
#将m转化为cm,采取的方法是将包含cm的剔除
rows_with_cms=df1['身高'].str.contains('cm').fillna(False)
rows_with_ms = (1-rows_with_cms).astype(np.bool) #布尔型数组取反,将上句用"~"也同样能取反
for i,height in df1[rows_with_ms].iterrows():
    m=float(height['身高'][:-1])*100 #这里的转换必须先将去掉m的字符串转换成float
    df1.at[i,'身高']='{}cm'.format(m)
df1.to_excel('test.xlsx')

rows_with_jins:
在这里插入图片描述

iterrows() 横向遍历
在这里插入图片描述

布尔型数组取反操作,numpy中取反运算符~可以将Boolean类型值取反,更简单
在这里插入图片描述
关于字符的转换:
在这里插入图片描述
有关df.at和loc
在这里插入图片描述
最后规范的表格:
在这里插入图片描述
ps.表是将cm转换成m,而将m转换成cm出现了以上一些问题,列出来以供学习和参考。
在过程中发现很多问题,原因是python基础不行,接下来要系统学习python语句,主要使用的书籍及github上的代码:
利用python进行数据分析
https://github.com/wesm/pydata-book

3.合理性

问题:非ASCII字符
可以用删除或者替换的方式来解决非ASCII问题,正则表达式,这是一个字符串,前面的一个 r 表示字符串为非转义的原始字符串,让编译器忽略反斜杠,也就是忽略转义字符。^表示“非”,\x00-\x7F是ASCII十六进制的范围(0-127D),+表示多个字符进行匹配。

df['name'].replace({r'[^\x00-\x7F]+':''},regex=True, inplace=True)

4.唯一性

问题1:一列有多个参数
如将姓名列拆分成firstname和lastname两个字段,以达到数据整洁的目的。

df[['first_name','last_name']]=df['name'].str.split(' ',expand=True)#expand=True参数将字符串拆分成多列,返回一个数据框,默认False。' '参数可省。
df.drop('name',axis=1,inplace=True) #删除源数据列

问题2:重复数据

df4.drop_duplicates(['first_name','last_name'],inplace=True)
展开阅读全文

没有更多推荐了,返回首页