透视表是一种可以对数据动态排布并且分类汇总的表格格式。或许大多数人都在Excel使用过数据透视表(如下图),也体会到它的强大功能,而在pandas中它被称作pivot_table。
pandas.pivot_table(data, values=None, index=None, columns=None,aggfunc=‘mean’, margins=False)
df = pd.read_csv('data/James_Harden.csv',encoding='utf8')
df.tail()
每个pivot_table必须拥有一个index,如果想查看哈登对阵每个队伍的得分,首先我们将对手设置为index:
pd.pivot_table(df,index=[u'对手'])
上图红框中的数值分别是[对手=‘76人’]这一组数据中[3分命中率,助攻,命中,得分,投篮命中率,投篮数,篮板]这些数据的平均值.
可以看到,对手成为了第一层索引,还想看看对阵同一对手在不同主客场下的数据,试着将对手与胜负与主客场都设置为index
pd.pivot_table(df,index=[u'对手',u'主客场'])
试着交换下它们的顺序,数据结果一样,只是索引的顺序发生变化:
pd.pivot_table(df,index=[u'主客场',u'对手'])
通过上面几个操作,我们可以发现:Index就是层次列,要通过透视表获取什么信息就按照相应的顺序设置列,所以在进行pivot之前你也需要足够了解你的数据。
如果我们只需要james harden在主客场和不同胜负情况下的得分、篮板与助攻三项数据:
pd.pivot_table(df,index=[u'主客场',u'胜负'],values=[u'得分',u'助攻',u'篮板'])
aggfunc参数可以设置我们对数据聚合时进行的函数操作。
当我们未设置aggfunc时,它默认aggfunc='mean’计算均值。
我们还想要获得james harden在主客场和不同胜负情况下的总得分、总篮板、总助攻时:
pd.pivot_table(df,index=[u'主客场',u'胜负'],values=[u'得分',u'助攻',u'篮板'],aggfunc=[np.sum,np.mean])
Columns类似Index可以设置列层次字段,它不是一个必要参数,作为一种分割数据的可选方式。
#fill_value填充空值,margins=True进行汇总
pd.pivot_table(df,index=[u'主客场'],columns=[u'对手'],values=[u'得分'],aggfunc=sum,fill_value=0,margins=1)
pd.pivot_table(df,index=[u'对手',u'胜负'],columns=[u'主客场'],values=[u'得分',u'助攻',u'篮板'],aggfunc=np.mean,fill_value=0)
你应该理解了pivot_table的用法?是不是在哪见过?
对,Groupby!
#按照"主客场"和"胜负"进行分组后进行交叉透视分析
pd.pivot_table(df,index='主客场',columns='胜负',values='篮板',aggfunc=np.sum,margins=True)
#用groupby实现同样的数据统计
df.groupby(['主客场','胜负'])[['篮板']].sum()
unstack对应的是excel中的透视功能,stack正好相反是逆透视
下面用groupby配合unstack实现pivot_table:
table=df.groupby(['主客场','胜负'])[['篮板']].sum()
table.unstack()
crosstab是pivot_table的一种特殊情况
pd.crosstab(df['主客场'],df['胜负'])
pd.pivot_table(df,values='篮板',index='主客场',columns='胜负',aggfunc='count')
透视表的作用【知道】
pandas.pivot_table(data, values=None, index=None, columns=None,aggfunc=‘mean’, margins=False)
unstack和stack
crosstab pivot_table的特殊情况