第一步:读入数据
原始数据中有一些缺失值。
第二步:使用均值填充缺失值
具体解释,参考:
Cara:Python练习:数据缺失值处理zhuanlan.zhihu.com第三步:异常值识别
方法一:箱线图
由图可见,sciencescore、englishscore这两列存在离群点。
箱线图判断异常的的规则如下:
方法二:3倍标准差
代码如下:
注释:①判断异常值需要字段为数值型,字符串(如姓名、班级、性别字段)不能混入。因此,这里先将所有数值型字段摘取出来,单独形成一个数据框t。数据框的iloc()方法用于对数据框进行行和列的摘取。iloc[:,4:]表示摘取所有行,从索引值为4的列开始到最后一列。
当返回结果为NaN时,表示该数字不是异常值。为什么是这样呢?不太明白原理。
abs(t-t.mean()) > 1.5*t.std()中的t指某一列中某一个值,t.mean()指某一列的均值,t.std()指某一列的均值。数据框支持这种运算方式,倒是很特别~
由上述结果可知,四个列的所有值都没有异常值。这一结果与使用箱线图得出的结果不同。因为,二者对于异常点的判断规则不同~
修改异常点的判断规则为1.5倍标准差,结果如下:
返回结果为数字的为异常值。
查看所有的异常值记录:
注释:这里有点巧妙!因为返回结果为NaN,即缺失值,表明数据不是异常值,那么如果删除整行全是NaN的记录,则剩下的就是包含异常值的记录啦~
对于异常值可以删除,也可以当作缺失值,采用各种方法进行填充。
已经知道异常值所在的行的索引值为[2,4,5,6,13,17,18]。问题是,Python如何根据索引值删除原数据df中对应的多个行呢?
用笨办法,写一个for循环,一行一行地删:
不过,手动抄写索引值,真的很笨,有没有大神有更好的办法,快速删除原数据中异常值所在的行啊?
参考资料:
用Python玩转数据_中国大学MOOC(慕课)www.icourse163.org