Pandas透视表(pivot_table)详解:从基础到高级应用

顾言
顾言
发布时间:2026-10-13| 5人浏览过
原创

本文深入解析Pandas库中的pivot_table函数,涵盖从数据读取、索引设置、聚合函数(如sum, mean, len)配置到多级分组的高级应用。通过销售漏斗案例,演示如何利用columns、values、fill_value及margins等参数构建灵活报表,并结合DataFrame过滤实现高效数据分析。

Pandas透视表概述

介绍

许多读者可能曾在Excel中频繁使用数据透视表,Pandas同样提供了功能相似的工具,即pivot_table。尽管该函数功能强大,但为了获得格式完美的输出,开发者往往需要反复查阅其语法。因此,本文将重点解析pandas中的pivot_table函数,并指导读者如何将其应用于实际数据分析场景。

若对该概念尚不熟悉,可参考wikipedia上的详细解释。值得一提的是,微软已为PivotTable(透视表)注册了商标。需要明确的是,本文所讨论的透视表并非指代微软的注册商标产品,而是指通用的数据分析概念。

作为附加价值,我整理了一份pivot_table使用备忘单,可在本文末尾查阅,希望能为读者提供便利。若该备忘单对您有所帮助,欢迎反馈。

数据准备与环境配置

数据

使用pandas中pivot_table的一个关键挑战在于,必须充分理解数据背景,并明确希望通过透视表解决的具体问题。尽管pivot_table看似简单,但它能迅速实现复杂的数据分析需求。

本文将以一个销售渠道(亦称销售漏斗)为例进行追踪。核心问题在于,部分销售周期较长(例如“企业软件”或“资本设备”领域),管理者希望更详尽地掌握全年的销售情况。

典型的问题包括:

  • 本渠道的收入总额是多少?
  • 渠道中涉及哪些产品?
  • 哪位销售人员(Rep)在哪个阶段(Status)销售了何种产品?
  • 我们在年底前完成交易的可能性有多大?

许多公司会使用CRM工具或其他销售软件来跟踪此过程。虽然他们可能拥有有效的数据分析工具,但仍有人员需要将数据导出至Excel,并利用透视表工具进行汇总。

使用Pandas透视表是一个理想选择,因为它具备以下优势:

  • 速度更快(一旦配置完成)
  • 代码自解释(通过阅读代码即可知晓其执行逻辑)
  • 易于生成报告或邮件内容
  • 更具灵活性,因为可以定义自定义的聚合函数

Read in the data

首先,让我们搭建所需的环境。

如果您希望跟随本文继续操作,可以下载这个Excel文件。


import pandas as pd

import numpy as np

版本提醒

由于Pivot_table API随时间有所更新,为确保本文示例代码正常运行,请确保安装了较新版本的Pandas(>0.15)。本文示例还使用了category数据类型,这也需要确保是较新版本。

首先,将我们销售渠道的数据读入到数据帧中。


df = pd.read_excel("../in/sales-funnel.xlsx")

df.head()

 

为方便起见,我们将上表中“Status”列定义为category,并按我们想要的查看方式设置顺序。

其实,并不严格要求这样做,但这样做能够在分析数据的整个过程中,帮助我们保持所想要的顺序。


df["Status"] = df["Status"].astype("category")

df["Status"].cat.set_categories(["won","pending","presented","declined"],inplace=True)

构建基础透视表

处理数据

既然我们建立数据透视表,我觉得最容易的方法就是一步一个脚印地进行。添加项目和检查每一步来验证你正一步一步得到期望的结果。为了查看什么样的外观最能满足你的需要,就不要害怕处理顺序和变量的繁琐。

最简单的透视表必须有一个数据帧和一个索引。在本例中,我们将使用“Name(名字)”列作为我们的索引。


pd.pivot_table(df,index=["Name"])

此外,你也可以有多个索引。实际上,大多数的pivot_table参数可以通过列表获取多个值。


pd.pivot_table(df,index=["Name","Rep","Manager"])

这样很有趣但并不是特别有用。我们可能想做的是通过将“Manager”和“Rep”设置为索引来查看结果。要实现它其实很简单,只需要改变索引就可以。


pd.pivot_table(df,index=["Manager","Rep"])

可以看到,透视表比较智能,它已经开始通过将“Rep”列和“Manager”列进行对应分组,来实现数据聚合和总结。那么现在,就让我们共同看一下数据透视表可以为我们做些什么吧。

为此,“Account”和“Quantity”列对于我们来说并没什么用。所以,通过利用“values”域显式地定义我们关心的列,就可以实现移除那些不关心的列。


pd.pivot_table(df,index=["Manager","Rep"],values=["Price"])

“Price”列会自动计算数据的平均值,但是我们也可以对该列元素进行计数或求和。要添加这些功能,使用aggfunc和np.sum就很容易实现。


pd.pivot_table(df,index=["Manager","Rep"],values=["Price"],aggfunc=np.sum)

aggfunc可以包含很多函数,下面就让我们尝试一种方法,即使用numpy中的函数mean和len来进行计数。


pd.pivot_table(df,index=["Manager","Rep"],values=["Price"],aggfunc=[np.mean,len])

如果我们想通过不同产品来分析销售情况,那么变量“columns”将允许我们定义一个或多个列。

列与值的配置技巧

列vs.值

我认为pivot_table中一个令人困惑的地方是“columns(列)”和“values(值)”的使用。记住,变量“columns(列)”是可选的,它提供一种额外的方法来分割你所关心的实际值。然而,聚合函数aggfunc最后是被应用到了变量“values”中你所列举的项目上。


pd.pivot_table(df,index=["Manager","Rep"],values=["Price"],

        columns=["Product"],aggfunc=[np.sum])

然而,非数值(NaN)有点令人分心。如果想移除它们,我们可以使用“fill_value”将其设置为0。


pd.pivot_table(df,index=["Manager","Rep"],values=["Price"],

        columns=["Product"],aggfunc=[np.sum],fill_value=0)

其实,我觉得添加“Quantity”列将对我们有所帮助,所以将“Quantity”添加到“values”列表中。


pd.pivot_table(df,index=["Manager","Rep"],values=["Price","Quantity"],

        columns=["Product"],aggfunc=[np.sum],fill_value=0)

有趣的是,你可以将几个项目设置为索引来获得不同的可视化表示。下面的代码中,我们将“Product”从“columns”中移除,并添加到“index”变量中。


pd.pivot_table(df,index=["Manager","Rep","Product"],

        values=["Price","Quantity"],aggfunc=[np.sum],fill_value=0)

高级聚合与总览功能

对于这个数据集,这种显示方式看起来更有意义。不过,如果我想查看一些总和数据呢?“margins=True”就可以为我们实现这种功能。


pd.pivot_table(df,index=["Manager","Rep","Product"],

        values=["Price","Quantity"],

        aggfunc=[np.sum,np.mean],fill_value=0,margins=True)

 

下面,让我们以更高的管理者角度来分析此渠道。根据我们前面对category的定义,注意现在“Status”是如何排序的。


pd.pivot_table(df,index=["Manager","Status"],values=["Price"],

        aggfunc=[np.sum],fill_value=0,margins=True)

一个很方便的特性是,为了对你选择的不同值执行不同的函数,你可以向aggfunc传递一个字典。不过,这样做有一个副作用,那就是必须将标签做的更加简洁才行。


pd.pivot_table(df,index=["Manager","Status"],columns=["Product"],values=["Quantity","Price"],

        aggfunc={"Quantity":len,"Price":np.sum},fill_value=0)

此外,你也可以提供一系列的聚合函数,并将它们应用到“values”中的每个元素上。


table = pd.pivot_table(df,index=["Manager","Status"],columns=["Product"],values=["Quantity","Price"],

        aggfunc={"Quantity":len,"Price":[np.sum,np.mean]},fill_value=0)

table

 

也许,同一时间将这些东西全都放在一起会有点令人望而生畏,但是一旦你开始处理这些数据,并一步一步地添加新项目,你将能够领略到它是如何工作的。我一般的经验法则是,一旦你使用多个“grouby”,那么你需要评估此时使用透视表是否是一种好的选择。

透视表的高级过滤应用

高级透视表过滤

一旦你生成了需要的数据,那么数据将存在于数据帧中。所以,你可以使用自定义的标准数据帧函数来对其进行过滤。

如果你只想查看一个管理者(例如Debra Henley)的数据,可以这样:


table.query('Manager == ["Debra Henley"]')

我们可以查看所有的暂停(pending)和成功(won)的交易,代码如下所示:


table.query('Status == ["pending","won"]')

这是pivot_table中一个很强大的特性,所以一旦你得到了你所需要的pivot_table格式的数据,就不要忘了此时你就拥有了pandas的强大威力。

The full notebook is available if you would like to save it as a reference.

如果你想将其保存下来作为参考,那么这里提供完整的笔记。

备忘单

为了试图总结所有这一切,我已经创建了一个备忘单,我希望它能够帮助你记住如何使用pandas的pivot_table。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持本站。

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。