数据透视表数据透视表就是将数据的每一列作为输入,输出将数据不断细分成多个维度累计信息的二维数据表,简单来说,数据透视表更像是一种多维的GroupBy 累计操作。 示例数据本例使用了泰坦尼克号的乘客信息,这份数据包含性别(gender)、年龄(age)、船舱等级(class)和船票信息(fare paid)等等: import numpy as np import pandas as pd import seaborn as sns titanic = sns.load_dataset('titanic') titanic.head()
泰坦尼克数据手工制作数据透视表可以使用之前学过的GroupBy 来手工制作数据透视表,比如我们要统计不同性别乘客的生还率: titanic.groupby('sex')[['survived']].mean()
不同性别乘客的生还率可以看出有四分之三的女性被救,但只有五分之一的男性被救! 要是我们还想同时观察不同性别与船舱等级的生还情况,根据GroupBy 的操作流程,可以先将船舱等级(class )与性别(sex )分组,然后选择生还状态(survived )列,应用均值(mean )累计函数,再将结果组合,最后通过unstack 来转换多级索引: titanic.groupby(['sex', 'class'])['survived'].aggregate('mean').unstack()
不同性别与船舱等级的生还情况这样的代码是不是看起来有些复杂?所以 Pandas 提供了pivot_table 方式来快速解决这种多维的累计分析任务。 数据透视表语法使用pivot_table 来实现上面的代码: titanic.pivot_table('survived', index='sex', columns='class')
不同性别与船舱等级的生还情况与GroupBy 方法相比,这样的代码可读性更强,结果也完全一样。可以发现生还率最高的是船舱等级最高的女性,一等舱的女性几乎全部生还,而三等舱男性的生还率仅为十分之一。 多级数据透视表还可以把年龄作为第三个维度,并用pd.cut 对年龄进行分段: age = pd.cut(titanic['age'], [0, 18, 80]) titanic.pivot_table('survived', ['sex', age], 'class')
多级数据透视表-1用pd.qcut 会根据船票价格的频率等分为两份,把它加入数据透视表看看: fare = pd.qcut(titanic['fare'], 2) titanic.pivot_table('survived', ['sex', age], [fare, 'class'])
多级数据透视表-2其他数据透视表选项DataFrame 的pivot_table 选项如下: # call signature as of Pandas 0.18 DataFrame.pivot_table(data, values=None, index=None, columns=None, aggfunc='mean', fill_value=None, margins=False, dropna=True, margins_name='All')
aggfunc 用于设置累计函数类型,默认是均值(还可以是'sum' , 'mean' , 'count' , 'min' , 'max' 等等,也可以用np.sum() , min() , sum() 等)。另外,可以通过字典为不同的列指定不同的累计函数:
titanic.pivot_table(index='sex', columns='class', aggfunc={'survived':sum, 'fare':'mean'})
通过字典指定不同的累计函数值得注意的是,上面的代码省去了values 因为,在aggfunc 的字典中已经指定了。 当需要计算每一组的总数时,可使用magins 参数: titanic.pivot_table('survived', index='sex', columns='class', margins=True)
使用 magins 添加 All 列magins 的标签可以通过margins_name 参数进行自定义,默认值是All 。
笔记整理自《Python数据科学手册》,本书的英文版以及一些资料已在Github开源(https://github.com/jakevdp/PythonDataScienceHandbook ),中文版可点击下方链接购买~
|