8-Pandas扩展之数据透视表
一、什么是数据透视表?
数据透视表(pivot table)是一种在电子表格程序和其他数据分析软件中常用的数据汇总工具。
数据透视表是一种交互式的表,可进行如求和与计算等操作。可以动态的改变版面布置,会立即按照新的布置重新计算数据。
在数据与探索和数据整理时比较常用。
二、数据透视表的创建
方法一:pd.pivot_table(data,)
方法二:data.pivot_table()
参数 | 说明 |
index | 指定索引,在数据透视表中按行分组 |
values | 选择显示的或需要进行聚合运算的列 |
columns | 将values按所选列进行分组 |
aggfunc | 聚合运算的方法 |
fill_value | 将缺失值替换成指定值 |
dropna | 默认为True,不包含全部为缺失值的列 |
margins | 添加行/列的总计数据,默认是False |
margins_name | 命名添加的行/列总计数据 |
(1)index
以class.xlsx为例,将index设为sex,表中根据sex一列进行分组聚合,默认计算数值型数据的平均值
>>> df = pd.read_excel('C:/Users/xhl/Desktop/input/class.xlsx') >>> df class sex score_math score_music 0 A male 95 79 1 A female 96 90 2 B female 85 85 3 C male 93 92 4 B female 84 90 5 B male 88 70 6 C male 59 89 7 A male 88 86 8 B male 89 74 #默认求均值 >>> df.pivot_table(index='sex') score_math score_music sex female 88.333333 88.333333 male 85.333333 81.666667 >>> df.pivot_table(index='sex',aggfunc = np.max) class score_math score_music sex female B 96 90 male C 95 92
使用index设置层次化索引
>>> df.pivot_table(index=['sex','class']) score_math score_music sex class female A 96.0 90.0 B 84.5 87.5 male A 91.5 82.5 B 88.5 72.0 C 76.0 90.5
(2)values---显示需要进行聚合运算的类
>>> df.pivot_table(index='sex',values='score_math') score_math sex female 88.333333 male 85.333333
(3)columns---设置分组方式
#columns表示根据class将数学分数进行纵向分组 >>> df.pivot_table(index='sex',values='score_math',columns='class') class A B C sex female 96.0 84.5 NaN male 91.5 88.5 76.0
index与columns的列进行互换,将该卞数据透视表的结构
>>> df.pivot_table(index='class',columns='sex') score_math score_music sex female male female male class A 96.0 91.5 90.0 82.5 B 84.5 88.5 87.5 72.0 C NaN 76.0 NaN 90.5 >>> df.pivot_table(index='sex',columns='class') score_math score_music class A B C A B C sex female 96.0 84.5 NaN 90.0 87.5 NaN male 91.5 88.5 76.0 82.5 72.0 90.5
(4)values和columns的区别
- values选择的列是希望在表中展示的数值,聚合函数aggfunc最终将应用到该值之上
- columns选择的列是在提供一个将values的值进行纵向分组的方式
(5)aggfunc传入Numpy函数
传入一个一个函数就进行一次计算,传入多个函数就进行多次计算,不再赘述;
>>>aggfunc=np.sum >>>aggfunc=[np.sum,np.max] >>>{'score_math':[np.sum,np.max],'score_music':np.sum}
(6)margins添加行/列总计
>>> df.pivot_table(index='sex',values='score_math',columns='class',margins = True) class A B C All sex female 96.0 84.5 NaN 88.333333 male 91.5 88.5 76.0 85.333333 All 93.0 86.5 76.0 86.333333
(7)margins_name:对 margins进行命名
>>> df.pivot_table(index='sex',values='score_math',columns='class',margins = True,margins_name = 'all_mean') class A B C all_mean sex female 96.0 84.5 NaN 88.333333 male 91.5 88.5 76.0 85.333333 all_mean 93.0 86.5 76.0 86.333333