【基本工具】S02E17 数据透视表的使用方法

0.本集概览

1.透视表的基本使用
2.透视表实现高维度的行列分组
3.透视表实现多属性观察及自定义统计函数

这一季里,各种表啊什么的可真多啊,这又是什么鬼~

1.透视表的使用背景

我先不说透视表是啥,我还是先说一个问题,我们这一集举泰坦尼克号的乘客信息这个经典数据。
代码片段:

import numpy as np
import pandas as pd
import seaborn as sns
titanic = sns.load_dataset('titanic')

print(titanic.head())

运行结果:

   survived  pclass     sex   age  sibsp  parch     fare embarked  class  \
0         0       3    male  22.0      1      0   7.2500        S  Third
1         1       1  female  38.0      1      0  71.2833        C  First
2         1       3  female  26.0      0      0   7.9250        S  Third
3         1       1  female  35.0      1      0  53.1000        S  First
4         0       3    male  35.0      0      0   8.0500        S  Third

     who adult_male deck  embark_town alive  alone
0    man       True  NaN  Southampton    no  False
1  woman      False    C    Cherbourg   yes  False
2  woman      False  NaN  Southampton   yes   True
3  woman      False    C  Southampton   yes  False
4    man       True  NaN  Southampton    no   True  

首先,我们按性别分组,看看男性和女性的生还率各是多少?

这用上一集讲的groupby不就完了?看看,轻松解决~
代码片段:

print(titanic.groupby('sex')['survived'].mean())

运行结果:

sex
female    0.742038
male      0.188908
Name: survived, dtype: float64

那接着再来,如果加上另一个维度,我们看看不同性别和船舱等级的生还情况:
代码片段:

print(titanic.groupby(['sex','class'])['survived'].mean())

运行结果:

sex     class 
female  First     0.968085
        Second    0.921053
        Third     0.500000
male    First     0.368852
        Second    0.157407
        Third     0.135447
Name: survived, dtype: float64

我们把他转换成DataFrame:
代码片段:

print(titanic.groupby(['sex','class'])['survived'].mean().unstack())

运行结果:

class      First    Second     Third
sex                                 
female  0.968085  0.921053  0.500000
male    0.368852  0.157407  0.135447

你也许会问了,这说来说去不还是上一集的东西吗?

2.透视表的高维行列分组

别急,上一集的内容确实能解决这里的问题,但是由于类似的多维GroupBy应用场景非常普遍,因此Pandas提供了一个快捷方式pivot_table来快速解决多维的累计分析任务。

在函数中指定观察的数据内容是survived,索引采用sex列,而列则使用class,sex和class就是我们的分组维度,而survived就是我们考察的每组的变量值。
代码片段:

print(titanic.pivot_table('survived', index='sex', columns='class'))

运行结果:

class      First    Second     Third
sex
female  0.968085  0.921053  0.500000
male    0.368852  0.157407  0.135447

这种透视表的代码与GroupBy相比,实现的效果一样,某种程度上更能表征出结果的形态。

top Created with Sketch.