Python中pandas透视表pivot_table功能详解

Python013

Python中pandas透视表pivot_table功能详解,第1张

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

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

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

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

数据格式如下:

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

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

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

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

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

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

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

Columns类似 Index 可以设置列层次字段,它不是一个必要参数,作为一种分割数据的可选方式。

fill_value 填充空值, margins=True 进行汇总

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

结果如下:

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

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

1.长宽表的变形

什么是长表?什么是宽表?这个概念是对于某一个特征而言的。例如:一个表中把性别存储在某一个列中, 那么它就是关于性别的长表如果把性别作为列名,列中的元素是某一其他的相关特征数值,那么这个表是 关于性别的宽表。

1.1 pivot

pivot 是一种典型的长表变宽表的函数。对于一个基本的长变宽的操作而言,最重要的有三个要素,分别是变形后的行索引、需要转到列索引的列, 以及这些列和行索引对应的数值,它们分别对应了 pivot 方法中的 index, columns, values 参数。新生成表的 列索引是 columns 对应列的 unique 值,而新表的行索引是 index 对应列的 unique 值,而 values 对应了想 要展示的数值列。

利用 pivot 进行变形操作需要满足唯一性的要求,即由于在新表中的行列索引对应了唯一的 value ,因此原 表中的 index 和 columns 对应两个列的行组合必须唯一。例如,现在把原表中第二行张三的数学改为语文就 会报错,这是由于 Name 与 Subject 的组合中两次出现 (”San Zhang”, ”Chinese”) ,从而最后不能够确定到 底变形后应该是填写 80 分还是 75 分。

pandas 从 1.1.0 开始,pivot 相关的三个参数允许被设置为列表,这也意味着会返回多级索引。这里构造一 个相应的例子来说明如何使用:下表中六列分别为班级、姓名、测试类型(期中考试和期末考试)、科目、成 绩、排名。

根据唯一性原则,新表的行索引等价于对 index 中的多列使用 drop_duplicates ,而列索引的长度为 values 中的元素个数乘以 columns 的唯一组合数量(与 index 类似)。

1.2 pivot_table

pivot 的使用依赖于唯一性条件,那如果不满足唯一性条件,那么必须通过聚合操作使得相同行列组合对应 的多个值变为一个值。例如,张三和李四都参加了两次语文考试和数学考试,按照学院规定,最后的成绩是 两次考试分数的平均值,此时就无法通过 pivot 函数来完成。

1.3 melt

长宽表只是数据呈现方式的差异,但其包含的信息量是等价的,前面提到了利用 pivot 把长表转为宽表,那 么就可以通过相应的逆操作把宽表转为长表,melt 函数就起到了这样的作用。

1.4 wide_to_long

melt 方法中,在列索引中被压缩的一组值对应的列元素只能代表同一层次的含义,即 values_name 。现在 如果列中包含了交叉类别,比如期中期末的类别和语文数学的类别,那么想要把 values_name 对应的 Grade 扩充为两列分别对应语文分数和数学分数,只把期中期末的信息压缩,这种需求下就要使用 wide_to_long 函数来完成。

2 索引的变形

2.1 stack 与 unstack

unstack 函数的作用是把行索引转为列索引

unstack 的主要参数是移动的层号,默认转化最内层,移动到列索引的最内层,同时支持同时转化多个层

类似于 pivot 中的唯一性要求,在 unstack 中必须保证 被转为列索引的行索引层和 被保留的行索引层构成 的组合是唯一的,例如把前两个列索引改成相同的破坏唯一性,那么就会报错

与 unstack 相反,stack 的作用就是把列索引的层压入行索引,其用法完全类似。

2.2 聚合与变形的关系

在上面介绍的所有函数中,除了带有聚合效果的 pivot_table 以外,所有的函数在变形前后并不会带来 values 个数的改变,只是这些值在呈现的形式上发生了变化。在上一章讨论的分组聚合操作,由于生成了新的行列 索引,因此必然也属于某种特殊的变形操作,但由于聚合之后把原来的多个值变为了一个值,因此 values 的 个数产生了变化,这也是分组聚合与变形函数的最大区别。

3 其他变形函数

3.1 crosstab

crosstab 并不是一个值得推荐使用的函数,因为它能实现的所有功能 pivot_table 都能完成,并且速度更快。 在默认状态下,crosstab 可以统计元素组合出现的频数,即 count 操作。例如统计 learn_pandas 数据集中 学校和转系情况对应的频数

3.2 explode

explode 参数能够对某一列的元素进行纵向的展开,被展开的单元格必须存储 list, tuple, Series, np.ndarray 中的一种类型。

3.3 get_dummies

get_dummies 是用于特征构建的重要函数之一,其作用是把类别特征转为指示变量。例如,对年级一列转为 指示变量,属于某一个年级的对应列标记为 1,否则为 0