python缺失值处理案例分析:泰坦尼克数据

原文连接:https://www.cnblogs.com/tecdat/p/9430901.htmlhtml

缺失值处理spa

真实数据每每某些变量会有缺失值。htm

首先,咱们用 info( ) 语句操做,看到整份数据的大概状况:对象

  titanic_df.info()blog

从这份数据咱们能够发现,这里一共有 891 行数据,因此在中间那一列数据中看到的不是 891 个数据的,都是有缺失值的。好比年龄Age这一列,有714个非空数值,就有 891-714=177 个缺失值。又好比船舱号码 cabin,缺失值就更多了。登船码头的缺失值比较少,后面能够不用处理。索引

这些缺失值是怎么处理的呢?通常是三种处理方法:不处理/丢弃/填充。rem

这里,cabin有超过70%以上的缺失值,咱们能够考虑直接丢掉这个变量。 -- 删除某一列数据get

像Age这样的重要变量,有20%左右的缺失值,咱们能够考虑用中位值来填补。-- 填补缺失值it

咱们通常不提倡去掉带有缺失值的行,由于其余非缺失的变量可能提供有用的信息。-- 删除带缺失值的行class

删除带缺失值的行(通常不建议):df.dropna( )

删除某一列:df.drop('column_name', axis=1, inplace=True)

填充缺失值:df.column_name.fillna( )

axis=1,表明删除的是一列的数据,也就是 column_name 这一列。inplace=True,表示在 df 这个原始数据上面进行修改。

其实咱们这节课重点的是最后一个:填充缺失值。fill 是填充,na 是缺失值的代称。

咱们在 info( ) 这个运行中能够看到 Age 的缺失值很多,下面将使用中位数来填充 缺失值。

填补年龄数据中的缺失值

  直接使用全部人年龄的中位数来填补

为了方便后面的比较,咱们首先用 describe 统计数据。

  查看Age列的统计值

这份数据照样是能够看到,非缺失值 count 是有 714,平均值 mean 是 29.6岁,标准差 std 是 14.5,这时能够注意一下 50% 那个数据:28。

  中位数

为了防止数据有改动,咱们在开始以前须要从新载入数据。

正确的中位数可使用 median 的方法获取,获得的数和上面的 50% 的数是同样的。

  填充年龄缺失值

把中位数赋值给 age_median1,这个操做体如今第二行代码。个人理解是,要是这里不从新赋值的话,后面须要用到这个中位数的时候,就须要完整码出 titanic_df.Age.median( ) 这一句,从新赋值就能够直接使用 age_median1 来代替稍微长一点的句子了。

titanic_df.Age.fillna(age_median1,inplace=True) 中,由于使用到Age这列数据,而后用 fillna 来实现填充,因此语句用 titanic_df.Age.fillna( ) 来表达,括号里面须要填的参数就是须要填充的值,也就是里面的缺失值都是由刚刚赋值的 age_median1 来代替。逗号后面再加上inplace=True,表示在原来的 df 数据中进行修改了,若是不加上这个参数,就须要把填充后的值从新赋值给 Age 这一列,因此 inplace 这个动做是为了简单起见。

再来看咱们获得的结果,这个时候的非空缺失值已经变成了891,平均值也从本来的29.7降到了29.4,由于咱们刚刚填充的中位数是28,比原来的平均值小,因此会有所新的平均值也会有所降低。

上面讲的是全部人的年龄中位数,如今咱们进一步来思考:性别因素,会怎么影响结果呢?

考虑性别因素,分别用男女乘客各自年龄的中位数来填补

因为上面的操做已经对原始数据进行修改了,因此要是咱们须要从新分类,那就要从新载入原始数据,否则后面的操做都会以上一步填充了全部年龄缺失值的基础上操做的哦!这个亏我吃过。。。

  性别的中位数

咱们获得的女性中位数是 27,男性的是 29,仍是有差距的吧!咱们后面须要用到的是,用得出的中位数来填充男女的缺失值。

接下来的步骤,按照之前,一般的思路是用布尔型索引取到女性中缺失值的数据,而后用 27 从新赋值;同理可求男性的操做。

可是咱们这节课学了fillna 这个新的方法啊!

不过刚刚咱们使用 fillna 的时候,填充的只是一个数值,这里不止一个数值,就须要根据不一样的状况来填充。此时能够用到 Pandas 中里的一个小技巧,Pandas 的值在运算的过程当中,会根据索引的值来进行自动的匹配。在这里咱们能够看到这里的索引是 female 和 male 两个值,若是原始数据也能够用性别来进行索引的话,就能够用 fillna 自动匹配相应的索引形式进行填充了。

  fillna 进行性别分类索引

因此这里要对原来的数值从新设置索引,一开始是 0 1 2 这样的数值,如今要把它设置成性别这一列数据。用 set_index 语句,用 Sex 来进行索引,同时加入参数 inplace=True,表示在原来的数据上进行修改。

inplace=True的含义应该讲了第三遍了,其实我以为要是否是很明白这个语句的用法时,你能够先不加上这一句,跟着打代码,而后到后面运行的哪一步你发现和老师的代码不同的时候,你就知道这个语句的重要性了。

咱们能够看到这里的运行结果 列索引变成了 Sex,列首索引是 male 和 female ,在行首 Sex 已经不存在了。

  填充性别分类的缺失值

咱们将这里分类中位数赋值为 age_median2。填充的套路和上面也是同样同样的,根据 Pandas 的自动匹配,填充的时候会根据索引来匹配不一样的值了。由于后续须要用到 Sex 这一列,因此这里也须要重置索引,将索引变成它的列。这里使用 reset_index。

非空值是 891 时就说明缺失值所有填充完毕了,这时候的均值是29.4。

因此到这里,咱们把性别分类的缺失值也用各自的中位数填充完毕了。下一步要考虑的是,同时两个因素的影响:

同时考虑性别和舱位因素

那咱们首先来看一下,在不一样年龄和不一样舱位的中位数,有什么变化呢?

groupby 分组的对象分别是 Pclass 舱位 和 Sex 性别,因为这里须要考量的有两个因素:性别和舱位,因此这里须要使用到中括号,后面加上用 Age.median 就能够获得分组的中位数了。

  不一样舱位男女年龄的中位数

这里就有两个索引,分别是舱位和性别,咱们能够看到,随着舱位的降低,它的年龄也是在降低的。用咱们的话理解就是,年轻人广泛比年长的穷啊,年龄大一点的人积累的财富也多一点。

那接下来咱们就用得出的中位数来各自从新赋值给舱位和性别。这时仍是能够用 fillna 的,可是须要设置二重索引。

  舱位和年龄的分类

套路仍是同样的,把这里得出的中位数赋值为 age_median3,而后对索引进行从新的赋值,一样的,这里有两个因素,也是使用中括号,用 set_index 的方法。

而后来看一下重置索引后的数据。看输出咱们是能够看到二重索引的,第一列的组合内容一共有 3*2=6 种状况。在列上面,已经没有 Pclass 和 Sex 两列数据了,由于此刻它们已经在索引上了。

如今按一样的方法 fillna ,用索引值来匹配不一样的中位数。

额。。。这两张看起来和上面的一毛同样啊,是我哪里错了吗。。。?

为了还原这样的索引,这里用 reset来重置

  分类填充结果

这里的输出能够看到非空数值已是891了,表示已经填满缺失值了。平均值降低到了29.1岁,由于三等舱的人数比较多,并且年龄比较小,因此拉低了平均值。

咱们总结一下,这里使用的 fillna 的方法,能够对整体的中位数进行操做,或者分类以后对中位数进行操做。分组以后因为有索引,因此同时也须要对原始数据进行索引,对于相同索引值,能够用匹配来进行填充。

相关文章
相关标签/搜索