Python学习笔记:pandas透视表之pivot_table、pivot
一、透视表
Excel
中有一个强大的功能 —— 数据透视表(pivot table
)。
利用数据透视表可以快速的进行分类汇总,自由组合字段快速计算,而这些只需要拖拉拽就可以实现。
典型的数据格式是扁平的,只包含行和列,不方便总结信息。
而透视表可以快速抽取有用的信息。
在 Pandas
中,可以利用 pivot_table
函数实现该功能。
二、pivot_table函数介绍
使用语法:
DataFrame.pivot_table(data,
values=None,
index=None,
columns=None,
aggfunc='mean',
fill_value=None,
margins=False,
dropna=True,
margins_name='All',
observed=False,
sort=True)
参数解释:
data -- DataFrame格式数据
values -- 需要汇总计算的列
index -- 行分组键
columns -- 列分组键
aggfunc -- 聚合函数,或函数列表,默认为平均值
fill_value -- 缺失值填充
margins -- 是否添加行列的总计
dropna -- 如果列的值都为NaN则不计算
margins_name -- 汇总行列名称
observed -- 是否显示观测值
三、pivot_table实操
1.构造测试数据集
import pandas as pd
import numpy as np
df = pd.DataFrame({'foo': ['one', 'one', 'one', 'two', 'two', 'two'],
'bar': ['A', 'B', 'C', 'A', 'B', 'C'],
'baz': [1, 2, 3, 4, 5, 6],
'zoo': ['x', 'y', 'z', 'q', 'w', 't']})
df
'''
bar baz foo zoo
0 A 1 one x
1 B 2 one y
2 C 3 one z
3 A 4 two q
4 B 5 two w
5 C 6 two t
'''
pd.pivot_table(df, index='bar',values='baz', aggfunc=sum)
pd.pivot_table(df, index=['bar', 'foo'], aggfunc=np.mean, values='baz')
pd.pivot_table(df, index='bar', aggfunc=[np.sum, np.mean], values='baz')
pd.pivot_table(df, index='bar', columns='foo', aggfunc=[np.sum], values='baz')
pd.pivot_table(df, index='bar', columns='foo', aggfunc=[np.sum], values='baz', margins=True)
# 火箭队当家球星James Harden某一赛季比赛数据
df2 = pd.read_csv(r'C:\Users\Hider\Desktop\basketball.txt', encoding='GBK')
df2
附上数据表:
对手,胜负,主客场,命中,投篮数,投篮命中率,3分命中率,篮板,助攻,得分
勇士,胜,客,10,23,0.435,0.444,6,11,27
国王,胜,客,8,21,0.381,0.286,3,9,27
小牛,胜,主,10,19,0.526,0.462,3,7,29
灰熊,负,主,8,20,0.4,0.25,5,8,22
76人,胜,客,10,20,0.5,0.25,3,13,27
黄蜂,胜,客,8,18,0.444,0.4,10,11,27
灰熊,负,客,6,19,0.316,0.222,4,8,20
76人,负,主,8,21,0.381,0.429,4,7,29
尼克斯,胜,客,9,23,0.391,0.353,5,9,31
老鹰,胜,客,8,15,0.533,0.545,3,11,29
爵士,胜,主,19,25,0.76,0.875,2,13,56
骑士,胜,主,8,21,0.381,0.429,11,13,35
灰熊,胜,主,11,25,0.44,0.429,4,8,38
步行者,胜,客,9,21,0.429,0.25,5,15,26
猛龙,负,主,8,25,0.32,0.273,6,11,38
太阳,胜,客,12,22,0.545,0.545,2,7,48
灰熊,胜,客,9,20,0.45,0.5,5,7,29
掘金,胜,主,6,16,0.375,0.143,8,9,21
尼克斯,胜,主,12,27,0.444,0.385,2,10,37
篮网,胜,主,13,20,0.65,0.615,10,8,37
步行者,胜,主,8,22,0.364,0.333,8,10,29
湖人,胜,客,13,22,0.591,0.444,4,9,36
爵士,胜,客,8,19,0.421,0.333,5,3,29
开拓者,胜,客,16,29,0.552,0.571,8,3,48
鹈鹕,胜,主,8,16,0.5,0.4,1,17,26
2.index
每个 pivot_table
必须拥有一个 index
。
# index 就是层次字段
pd.pivot_table(df2,index=u'对手')
pd.pivot_table(df2, index=[u'对手', u'主客场'])
pd.pivot_table(df2, index=[u'主客场', u'对手'])
3.values
对需要的计算数据进行筛选。
pd.pivot_table(df2, index=[u'主客场', u'胜负'], values=[u'得分', u'助攻', u'篮板'])
'''
助攻 得分 篮板
主客场 胜负
主 胜 10.555556 34.222222 5.444444
负 8.666667 29.666667 5.000000
客 胜 9.000000 32.000000 4.916667
负 8.000000 20.000000 4.000000
'''
4.aggfunc
聚合时的函数操作,默认是求平均值。
pd.pivot_table(df2, index=[u'主客场', u'胜负'], values=[u'得分', u'助攻', u'篮板'], aggfunc=[np.sum, np.mean])
'''
sum mean
助攻 得分 篮板 助攻 得分 篮板
主客场 胜负
主 胜 95 308 49 10.555556 34.222222 5.444444
负 26 89 15 8.666667 29.666667 5.000000
客 胜 108 384 59 9.000000 32.000000 4.916667
负 8 20 4 8.000000 20.000000 4.000000
'''
aggfunc
也可以使用 dict
类型。
pd.pivot_table(df2, index=[u'对手', u'胜负'],
columns=[u'主客场'],
values=[u'得分', u'助攻'],
aggfunc={u'得分':np.mean, u'助攻':[min,max,np.mean]},
fill_value=0)
5.columns
设置列层次字段,作为可选方式。
pd.pivot_table(df2, index=u'对手', columns=u'主客场', values=u'得分', aggfunc=np.sum)
6.fill_value
填充空值。
pd.pivot_table(df2, index=u'对手', columns=u'主客场', values=u'得分', aggfunc=np.sum, fill_value=0)
7.margins
汇总行列。
pd.pivot_table(df2, index=u'对手', columns=u'主客场', values=u'得分', aggfunc=np.sum, fill_value=0, margins=True)
8.透视之后的过滤
建立透视表之后,可以通过 query
进行查询结果。
df.query('bar == "A"')
df.query('bar == ["A","B"]')
四、pivot函数介绍
使用语法:
Pandas.pivot(data, index=None, columns=None, values=None)
实操:
df.pivot(index='foo', columns='bar', values='baz')
df.pivot(index='foo', columns='bar')['baz']
df.pivot(index='foo', columns='bar', values=['baz','zoo'])
# Exception: Data must be 1-dimensional
五、pivot 和 pivot_table 区别
pandas.pivot
的重点在于 reshape
, 合并同类项,所以在行与列的交叉点值的索引应该是唯一值,如果不是唯一,则会报错:
ValueError: Index contains duplicate entries, cannot reshape
尽量使用 pivot_table
可避免这个问题。
pivot_talbe
函数多了 aggfunc
参数,可专门指定对聚合后的行列做如何的操作,避免错误。
参考链接:pandas.DataFrame.pivot_table
参考链接:pandas.pivot
参考链接:在pandas中使用数据透视表