在工作中经常要用到excel来画透视表,那么在python中应该怎么画透视表呢?下面简单分享一下。
导入需要的库:
import numpy as np #用于基础数值计算
import pandas as pd #处理面板数据常用
import seaborn as sns #画图用,也能通过它获取一下练手用的数据
读取数据:
titanic = sns.load_dataset('titanic') #泰坦尼克号生存数据
titanic.columns #看数据的各个列名
titanic.head() #看开头5行数据
通过上面的代码可以看到数据中包含性别、年龄、舱位等级、是否生存等字段。
分组统计:
考察性别和舱位等级对生存率的影响:先使用聚集函数:
titanic.groupby('sex')['survived'].mean() #先用groupby将
#数据按照sex列分组,再对每组的survived列求平均即得不同性别的生存率
如果我们想同时观察性别和舱位等级对生存率的影响,使用聚集函数的话代码就有点复杂了:
titanic.groupby(['sex', 'class'])['survived'].mean().unstack()
#同时观察性别和舱位等级对生存率的影响,结果是列联表
使用透视表:pivot_table
titanic.pivot_table('survived', index='sex', columns='class') #
上面代码中index=‘sex’,columns='class’表示用性别作行,舱位等级作列,对每个分组分别求’survived’列的均值得出生存率。如果我们不想求survived的均值而想使用其它聚集函数,可以在pivot_table中增加accfunc参数,例如accfun='sum’表示求每组的总和,即不同舱位等级和性别的乘客的生存人数。
再增加年龄维度:
#先将年龄属性分成0-18岁和18至80岁两组:
age = pd.cut(titanic['age'], [0, 18, 80]) #默认上组限在内
titanic.pivot_table('survived', ['sex', age], 'class')
#这样就得到了不同性别、年龄组、舱位等级的乘客的生存率
也可以为不同的列指定不同的聚集函数,例如我们既想求每个分组的总生存人数,又想求每个分组乘客的平均票价,可以通过以下代码实现:
#为不同的列指定不同的accfunc:
titanic.pivot_table(index='sex', columns='class',
aggfunc={'survived':sum, 'fare':'mean'})
#性别为行,舱位等级为列,对每个分组的生存人数求和,票价求平均
#sum不用加引号是因为sum是python自带的函数,而mean是np中的函数,因此mean要加引号否则无法识别
margins=True给出每个分组的总计值:
titanic.pivot_table('survived', index='sex', columns='class', margins=True)