使用Pandas 玩转透视表(pivot_table)

也许大多数人都有在Excel中使用数据透视表的经历,其实Pandas也提供了一个类似的功能,名为 pivot_table。虽然pivot_table非常有用,但是我发现为了格式化输出我所需要的内容,经常需要记住它的使用语法。所以,本文将重点解释pandas中的函数 pivot_table,并教大家如何使用它来进行数据分析。

如果你对这个概念不熟悉,维基百科上对它做了详细的解释。顺便说一下,你知道微软为PivotTable(透视表)注册了商标吗?其实以前我也不知道。不用说,下面我将讨论的透视表并不是PivotTable。

作为一个额外的福利,我创建了一个总结pivot_table的简单备忘单。你可以在本文的最后找到它,我希望它能够对你有所帮助。如果它帮到了你,请告诉我。

数据
使用pandas中pivot_table的一个挑战是,你需要确保你理解你的数据,并清楚地知道你想通过透视表解决什么问题。其实,虽然pivot_table看起来只是一个简单的函数,但是它能够快速地对数据进行强大的分析。

在本文中,我将会跟踪一个销售渠道(也称为漏斗)。基本的问题是,一些销售周期很长(可以想一下“企业软件”、“资本设备”等),而管理者想更详细地了解它一整年的情况。

典型的问题包括:

本渠道收入是多少?

渠道的产品是什么?

谁在什么阶段有什么产品?

我们年底前结束交易的可能性有多大?

很多公司将会使用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)

图片

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的强大威力。图片

如果你想将其保存下来作为参考,那么这里提供完整的笔记:http://nbviewer.ipython.org/url/pbpython.com/extras/Pandas-Pivot-Table-Explained.ipynb

数据下载地址:http://pbpython.com/extras/sales-funnel.xlsx

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/727794.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

腾讯云学生服务器多少钱?怎么申请?

2024年腾讯云学生服务器优惠活动「云校园」,学生服务器优惠价格:轻量应用服务器2核2G学生价30元3个月、58元6个月、112元一年,轻量应用服务器4核8G配置191.1元3个月、352.8元6个月、646.8元一年,CVM云服务器2核4G配置842.4元一年&…

微信小程序(五十一)页面背景(全屏)

注释很详细,直接上代码 上一篇 新增内容: 1.页面背景的基本写法 2.去除默认上标题实习全屏背景 3. 背景适配细节 源码: index.wxss page{/* 背景链接 */background-image: url(https://pic3.zhimg.com/v2-a76bafdecdacebcc89b5d4f351a53e6a_…

python 截取字符串string.split

目录 作用语法只要第一个值获得第3个值遍历 作用 根据某个符号对数据进行截取 从而获得自己想要的内容 语法 使用’string.split’ 方法 对字符串’123/abc/BPYC’ 以 ‘/’ 进行截取 string "123/abc/BPYC" substring string.split("/") print(subs…

【目标分类图像增强方法】

图像增强方法及其原理 目标分类图像增强是一种用于提高深度学习模型泛化能力的技术,通过在训练过程中对原始图像进行各种变换来增加模型所见数据的多样性。以下是几种常见的图像增强方法及其原理: 几何变换: 旋转(Rotation&#…

【排序】435. 无重叠区间

435. 无重叠区间 方法概述 整体解决方案分为两个部分: eraseOverlapIntervals(int[][] intervals):这是主要方法,用于计算并返回需要移除的区间数量。intervalSchedule(int[][] intvs):这个辅助方法用于通过贪心算法计算出最大…

【SEO 初学者指南】搜索引擎的工作原理:抓取、索引、排名

了解搜索引擎的工作原理,从抓取和索引到排名和惩罚,以及优化和故障排除技巧。 搜索引擎是如何工作的? 搜索引擎通过抓取、索引和排名互联网内容来工作。首先,爬虫通过网络爬虫发现在线内容。然后,索引分析内容并将其…

Spring核心原理

目录 IOCxml配置创建对象xml配置注入属性自动装配引入外部属性文件注解创建对象注解注入属性 AOP方式一 : 通过JDK接口实现方式二 : 通过AspectJ实现AOP JdbcTemplateSpring事务管理整合Mybatis实现一实现二 WebFlux函数式编程 Spring是一个开放源代码的JavaEE设计层面框架&…

C++:拷贝构造函数

1.概念 在现实生活中,可能存在一个与你一样的自己,我们称之为双胞胎。那在创建对象的时候,可否创建一个与已存在对象一模一样的新对象呢?答案是可以的,这就要通过拷贝构造函数来实现了。 拷贝构造函数:只有…

微服务基础

目录 一、单体架构 二、分布式架构 三、微服务 四、微服务结构 五、SpringCloud 六、服务拆分 七、远程调用 一、单体架构 单体架构就是将业务的所有功能都集中在一个项目中进行开发,并打成一个包进行部署。 他的优点很明显,就是架构简单&#xff…

C++的类和对象(四):拷贝构造函数

目录 拷贝构造函数 特性 自定义类型的传值传参和传引用传参对比 赋值运算符重载 拷贝构造函数 基本概念:只有单个形参,该形参是对本类类型对象的引用(一般常用const修饰),在创建一个已存在对象一模一样的新对象时…

MySQL运维实战之备份和恢复(8.4)xtrabackup恢复全量备份

作者:俊达 恢复全量备份大致可以分成以下几步:解压备份文件、prepare备份文件、将数据copy到目标实例相关目录、启动数据库实例。 解压文件 如果备份时使用了xbstream,需要先解压备份文件。 我们备份时使用了–streamxbstream和gzip压缩&am…

数据结构:AVL树

目录 1、AVL树的概念 2、二叉搜索树的功能与实现 1、AVL树节点定义 2、AVL树的插入 3、AVL树的旋转操作 1、左旋 2、右旋 3、左右旋 4、右左旋 3、AVL树完整代码实现 1、AVL树的概念 在前面的文章中,我们学过了二叉搜索树,二叉搜索树虽可以缩短查…

勾股定理的七种经典证明

据说勾股定理约有500种证明方法,下面介绍几种经典的证明方法。 一、切割重拼法。 顾名思义,就是将图形切割成其他形式的图形,然后通过拼图转换为另一种图形,这个过程中图形的面积是不变的。 “赵爽弦图”是这种方法的经典应用&…

MYSQL刷题2| 1112.每位学生的最高成绩、1398.购买了产品A和产品B缺没有购买产品C的顾客

1112.每位学生的最高成绩 题目链接:1112. 每位学生的最高成绩 - 力扣(LeetCode) # Write your MySQL query statement below select e.student_id, MIN(course_id) AS course_id, grade from enrollments e where (student_id,grade) in (s…

JimuReport 积木报表 v1.7.2 紧急发布,修复1.7.1严重Bug

1.7.2-beta 紧急版 2024-03-07 紧急版本&#xff0c;修复1.7.1版本的严重bug。 集成依赖 springboot2依赖 <dependency><groupId>org.jeecgframework.jimureport</groupId><artifactId>jimureport-spring-boot-starter</artifactId><versi…

Android视角看鸿蒙第三课(module.json中的各字段含义之nametype)

Android视角看鸿蒙第三课(module.json中的各字段含义) 前言 上篇文章我们试图找到鸿蒙app的程序入口&#xff0c;确定了在鸿蒙工程中,由AppScope下的app.json5负责应用程序的图标及名称,由entry->src->main-module.json5负责桌面图标及名称的展示。 AppScope下的app.js…

c++ vector赋值新技能、函数返回动态数组、 计算静动态数组的大小

一、vector赋值新技能 方法1&#xff1a;pushback vector<int> a; a.pushback(10); 方法2&#xff1a;直接赋值(很少用) vector<int> a {1,2 ,3,4,5}; 二、函数返回动态数组 void func(vector<int>src, double *dtemp) {for (int i 0; i < src.siz…

Java 反射机制 和 绑定属性资源文件

反射机制 1、反射机制有什么用&#xff1f; 通过 java 语言中的反射机制可以操作字节码文件。 有点类似于黑客。&#xff08;可以读和修改字节码文件。&#xff09; 通过反射机制可以操作代码片段。&#xff08;class文件。&#xff09; 2、反射机制的相关类在哪个包下&#xf…

使用Kali搭建钓鱼网站教程

一、前言 使用kali工具一分钟制作出和目标网站一模一样的钓鱼网站。目标用户使用钓鱼网站登录自己的账号&#xff0c;账号密码将被自动劫持。 二、钓鱼网站的制作过程 1.在虚拟机VMvare中登录kali linux 2.准备一个目标网址 3.在kail中搜索使用工具 4.在弹出的选项中选择第一…

用友 NC saveDoc.ajax 任意文件上传漏洞复现

0x01 产品简介 用友NC是一款企业级ERP软件。作为一种信息化管理工具,用友NC提供了一系列业务管理模块,包括财务会计、采购管理、销售管理、物料管理、生产计划和人力资源管理等,帮助企业实现数字化转型和高效管理。 0x02 漏洞概述 用友 NC saveDoc.ajax接口处存在任意文件…