缺失值处理和数据透视表

  • 缺失值处理 pandas中的fillna()方法 必要时设置索引 填充时会自动根据索引填充
  • 数据透视表 pandas中的pivot_table函数

describe函数查看的是 数值变量的 统计信息,并未包括 分类变量数据的信息
如果需要擦汗分类别量的数据,需要使用include参数

titanic_df.describe()#只显示数据类的统计
titanic_df[["Survived","Age", "SibSp", "Parch"]].describe()#只看部分数据的统计量 前面实际上筛选出了想观察的数据
titanic_df.describe(include=[np.object])#使用include参数 查看分类变量的统计信息
#分类变量的统计信息,
#count 表示非缺失值的个数
#unique 非重复值的个数
#top 最高频值
# 最高频值出现的的次数

缺失值处理

  • 真实数据往往会存在缺失值
  • 超过百分之六七十的缺失值 我们可以考虑直接丢掉这个变量 --删除某列数据
  • 重要的数据 缺失百分之二三十,我们可以考虑用中位数或者平均值填补 --填补缺失值
  • 我们一般不提倡去掉带缺失值的行,因为非缺失值的变量可能提供有用的信息 --删除带缺失值的行
  1. 使用info函数 查看数据总量 以及各个变量非空值的个数,以及变量的类型。大致了解缺失值情况
    titanic_df.info()
  2. 在处理某一列之前,可以先查看该列的统计值 以便处理前后做个比较
    titanic_df.Age.describe()
  3. 使用中位数填补年龄数据中的缺失值
    1. 计算中位数
      age_median = titanic_df.Age.median()
    2. 使用fillna填充缺失值 inplace=True表示在原数据上直接修改 要对那一列填充na就点到那一列
      titanic_df.Age.fillna(age_median2, inplace=True)
    3. 再查看下统计值
      titanic_df.Age.describe()
      实际情况中,如果考虑更多的分类因素,会更接近真实数据。比如 考虑性别因素
      因为填充时要依据性别因素填充,因此 需要将这个性别这个属性作为索引

分别计算男女年龄的中位数
age_median2 = titanic_df.groupby('Sex').Age.median()
上面这行命令,依据sex分组,分组计算了年龄的中位数。得到的结果是个Series序列,索引是sex,值是不同性别的中位数。

在对源数据填充的时候,也要给源数据一个相同的索引,所以需要对源数据设置索引

titanic_df.set_index('Sex',inplace=True)

使用fillna填充数据时,会根据索引进行填充

titanic_df.Age.fillna(age_meida2,inplace=True)

填充过之后,要恢复成原来的样子,就要重置索引

titanic_df.reset_index(inplace=True)

查看下使用这种填充后统计量
titanic_df.Age.describe()

索引也可以是多重的,使用多重索引填充时,要保证索引的一致性。
比如分别计算不同舱位男女年龄的中位数

age_median3 = titanic_df.groupby(['Pclass', 'Sex']).Age.median()

计算的结果其实只有一个标量 那就是 age的中位数
而分类依据是作为索引出现的。age_median3是个series数据

因此在填充时,源数据的 这两个分类属性也要作为索引
重设索引时 记得使用inplace参数 保证数据在原数据上修改

# 设置索引
titanic_df.set_index(['Pclass','Sex'], inplace=True)
# 填充数据
titanic_df.Age.fillna(age_median3, inplace=True)
# 重置索引 
titanic_df.reset_index(inplace=True)

数据透视表df.pivot_table()

数据透视表是就是 在整个数据中 找到需要的数据 然后对数据 做一层运算
因此有三个关键参数 value 要操作的数据 index 把那个分类属性作为索引(分组) aggfunc应用的计算

titanic_df.pivot_table(values='Survived', index='Pclass', aggfunc=np.mean)
# 可以根据多个筛选条件对多个数据实行多个运算
titanic_df.pivot_table(values=['Survived','Age'], index=['Pclass','Sex'], aggfunc=[np.mean,np.max])

pivot_table还有一个参数叫做columns 也是个分类变量,跟index一样,不同的是会影响结果的显示。
只不过我们将它列在列里而不是行里,这也是为什么这个变量称为columns

连续变量离散化

  • 连续变量离散化是建模的一种常用方法
  • 离散化指的是 将某个变量所在的区间 分隔成几个小区间 落在同一个区间的观察值用同一个符号表示
  • 以年龄为例,最小值是0.42(婴儿),最大值是80,如果我们想产生一个五个级(levels),我们可使用cut或者qcut函数
  • cut函数将年龄的区间平均分隔为5份,qcut是让每个区间的观察值个数一样(5等分)
# 我们使用cut函数
# 我们可以看到每个区间的大小是固定的,大约是16岁
# 这个函数的第一个参数是 对谁切割,第二个参数是切割几份
titanic_df['AgeBand'] = pd.cut(titanic_df['Age'], 5)

value_counts函数的结果默认是排了序的,可以使用sort参数修改是否对结果排序
titanic_df.AgeBand.value_counts(sort=False)

# 同时绘制不同年龄组的生还概率图
# 参数row='AgeBand'表示将不同的年龄区间的图按行排列
# 参数aspect设置画布的长宽比
# 参数palette(调色板)设置hue分组的颜色
sns.FacetGrid(data = titanic_df, row='AgeBand', aspect=1.5) \
   .map(sns.pointplot, 'Pclass', 'Survived', 'Sex', hue_order=['male', 'female'],  palette='deep', ci=None)
#palette 配色参考 https://seaborn.pydata.org/tutorial/color_palettes.html?highlight=palette

你可能感兴趣的:(缺失值处理和数据透视表)