一、什么是数据透视表?
数据透视表(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