暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Python中pandas透视表pivot_table功能详解

原创 zayki 2023-11-23
986

Python中pandas透视表pivot_table功能详解

一文看懂pandas的透视表pivot_table

一、概述

1.1 什么是透视表?

透视表是一种可以对数据动态排布并且分类汇总的表格格式。或许大多数人都在Excel使用过数据透视表,也体会到它的强大功能,*而在pandas中它被称作pivot_table。*

1.2 为什么要使用pivot_table?

  • 灵活性高,可以随意定制你的分析计算要求
  • 脉络清晰易于理解数据
  • 操作性强,报表神器

二、如何使用pivot_table

首先读取数据,数据集是火箭队当家球星James Harden某一赛季比赛数据作为数据集进行讲解。

对手,胜负,主客场,命中,投篮数,投篮命中率,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

下官方文档中pivot_table的函数体:pandas.pivot_table - pandas 0.21.0 documentation

pivot_table(data, values=None, index=None, columns=None,aggfunc=‘mean’, fill_value=None, margins=False, dropna=True, margins_name=‘All’)

pivot_table有四个最重要的参数indexvaluescolumnsaggfunc,本文以这四个参数为中心讲解pivot操作是如何进行。

2.1 读取数据

import pandas as pd import numpy as np df = pd.read_csv('James_Harden.csv',encoding='utf8') df

数据格式如下:

img

img

2.2 Index

每个pivot_table必须拥有一个index,如果想查看james harden对阵每个队伍的得分,首先我们将对手设置为index

pd.pivot_table(df,index=[u'对手'])

img

img

对手成为了第一层索引,还想看看对阵同一对手在不同主客场下的数据,试着将对手与胜负与主客场都设置为index,其实就变成为了两层索引

pd.pivot_table(df,index=[u'对手',u'主客场'])

img

img

试着交换下它们的顺序,数据结果一样:

pd.pivot_table(df,index=[u'主客场',u'对手'])

img

img

看完上面几个操作,Index就是层次字段,要通过透视表获取什么信息就按照相应的顺序设置字段,所以在进行pivot之前你也需要足够了解你的数据。

2.3 Values

通过上面的操作,我们获取了james harden在对阵对手时的所有数据,Values可以对需要的计算数据进行筛选,如果我们只需要james harden在主客场和不同胜负情况下的得分、篮板与助攻三项数据:

pd.pivot_table(df,index=[u'主客场',u'胜负'],values=[u'得分',u'助攻',u'篮板'])

img

2.4 Aggfunc

*aggfunc参数可以设置我们对数据聚合时进行的函数操作。*

当我们未设置aggfunc时,它默认aggfunc='mean'计算均值。我们还想要获得james harden在主客场和不同胜负情况下的总得分、总篮板、总助攻时:

pd.pivot_table(df,index=[u'主客场',u'胜负'],values=[u'得分',u'助攻',u'篮板'],aggfunc=[np.sum,np.mean])

img

2.5 Columns

*Columns类似Index可以设置列层次字段,它不是一个必要参数,作为一种分割数据的可选方式。*
fill_value填充空值,margins=True进行汇总

pd.pivot_table(df,index=[u'主客场'],columns=[u'对手'],values=[u'得分'],aggfunc=[np.sum],fill_value=0,margins=1)

img

现在我们已经把关键参数都介绍了一遍,下面是一个综合的例子:

table=pd.pivot_table(df,index=[u'对手',u'胜负'],columns=[u'主客场'],values=[u'得分',u'助攻',u'篮板'],aggfunc=[np.mean],fill_value=0)

结果如下:

img

img

aggfunc也可以使用dict类型,如果dict中的内容与values不匹配时,以dict中为准。

table=pd.pivot_table(df,index=[u'对手',u'胜负'],columns=[u'主客场'],values=[u'得分',u'助攻',u'篮板'],aggfunc={u'得分':np.mean, u'助攻':[min, max, np.mean]},fill_value=0)

结果就是助攻求min,maxmean,得分求mean,而篮板没有显示。

img

img

18人点赞

Python3之数据分析学习笔记

更多精彩内容,就在简书APP

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论