分享

Pandas | 数据透视表

 微笑如酒 2018-09-11

往期回顾

数据透视表

数据透视表就是将数据的每一列作为输入,输出将数据不断细分成多个维度累计信息的二维数据表,简单来说,数据透视表更像是一种多维的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'], [01880])
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 ),中文版可点击下方链接购买~


    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多