获取数据:
检查缺失值
首先第一步,我们先检查一下数据集中是否存在空值,可以用pandas中的isnull、nonull、info方法来检查,我们都来试一遍
data.isnull()
可以看到,因为数据太多,没有办法全部找出来,这个时候可以用到sum方法来进行统计每一列有多少个缺失值
data.isnull().sum()
结果显而易见,前三列各自带有3个缺失值。
那么nonull和info方法呢,我们也都来试一下
data.notnull().sum()
nonull与isnull方法相反,它是找出非空值
data.info()
info方法则是将数据集的详细详细给显示出来,可以看到数据集的行数,非空值以及数据类型等
清理异常值
使用seaborn来看一下数据的分布情况
sns.pairplot(data,hue='species')
plt.show()
从图中我们可以看到一个特别不合群的点,仔细观察发现它的花瓣长度达到了15cm以上,这显然是不合理的,所以把它给过滤成空值
data['petal_length'][data['petal_length']>14] = None
data.isnull().sum()
成功将异常值替换为空值,然后接下来就可以清理这些空值了。
处理缺失值
处理缺失值的方法主要有2种,一是直接删除带有缺失值的行或列,二是对缺失值进行填充
直接删除
pandas中的dropna方法可以达到删除的功能,以下是我个人总结的dropna的详细用法
参数 | 作用 |
axis | 选择作用的轴,axis=0删除行,axis=1删除列,默认为0 |
how | 可选参数有 ‘any’,和‘all’, 默认 ‘any’,any表示行或列中只要有一个缺失值就清除,all表示要整行都是缺失值才清除 |
thresh | thresh参数接受一个int值,表示保留有n个非空值的行或列 |
subset | subset参数接受一个集合作为值,可以是列表、元组、数组等,表示哪些列必须不能有空值,处于这些列或行的空值所处的行或列将被清除 |
inplace | inplace参数接受一个bool的值,表示是否在原数组上操作,如果值为True,那么返回None,并且直接对原数组进行缺失值的清理,否则就只返回一个copy |
这里数据集缺失值的清理我们可以先尝试一下直接删掉带有缺失值的行和列,看看效果如何
data.dropna().info()
从结果上可以看得出来,结果处理之后已经不存在缺失值了,但是删除数据集7行。如果我们选择的是对列进行操作,那会删掉哪些数据呢?我们再来试一下
data.dropna(axis=1).info()
结果很明显,缺失值是删掉了,但是我们的数据集却只剩下2列了。
剩下的一些参数我就不一一举例了。
填充
上面的dropna方法是直接进行删除操作,比较暴力,如果我们想保留这些数据,又想去掉缺失值,那么我们可以采用填充的方法fillna
下面是我个人总结的一些fillna的参数用法
参数 | 用法 |
value | 用于填充的值,也可以用字典、序列等进行填充 |
axis | 选择作用的轴,axis=0为行,axis=1为列,默认为0 |
method | 填充的方法。大致分为2种:ffill/pad拿前面的值填充,backfill/bfill拿后面的值填充,这里前后可以是行和列,根据axis的值决定,当空值处于行或列的头尾时会出现无值填充,继续为空值 |
limit | 限制每行或每列填充的空值个数 |
inplace | inplace参数接受一个bool的值,表示是否在原数组上操作,如果值为True,那么返回None,并且直接对原数组进行缺失值的清理,否则就只返回一个copy |
还是一样的数据,先检查一下缺失值的存在
data.isnull().sum()
这里我们可以看到,缺失值是出现在花萼长度,花萼宽度和花瓣长度的位置中,考虑到这些值不会相差特别大,所以我采用每一列的平均值进行缺失值的填充
fill_sepal_length = data['sepal_length'].mean()
fill_sepal_width = data['sepal_width'].mean()
fill_petal_length = data['petal_length'].mean()
data2 = data.fillna({'sepal_length':fill_sepal_length,
'sepal_width':fill_sepal_width,
'petal_length':fill_petal_length},).isnull().sum()
data2
填充完毕,这样数据集中就没有缺失值了。