数据分析—一文看懂数据透视表(Excel&Pandas-pivot_table实现)

【导语】也许大多数人都知道Excel中的数据透视表,也体会到了它的强大功能,那么Pandas也提供了一个类似的功能,也就是pivot_table。因为考虑到直接学pivot_table会有点难度,所以本篇文章将由浅入深的先通过excel实现透视表,慢慢地过渡到利用pandas来实现。

一、 什么是数据透视表

透视表是一种可以对数据动态排布并且分类汇总的表格格式。利用透视表可以快速地进行分类汇总,自由组合字段聚合计算。

二、使用excel透视表和pandas实现的区别

  • excel:
    只需要拖拉拽就能实现,简单易操作
  • pandas:
    更快(一旦设置之后)
    自行说明(通过查看代码,你将知道它做了什么)
    易于生成报告或电子邮件
    更灵活,因为你可以定制聚合函数

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

三、excel实现数据透视表

1、创建数据透视表

其实非常的简单,只需要选定我们想要进行透视的表,然后点击菜单栏中的插入透视表。

透视表中有五个基本概念:
筛选:你想要将什么进行分组,比如我想看一下不同供应商的一些信息,那么就是按照供应商进行筛选
:列值,一般是用时间序列值
:行值,你想要对什么内容进行展开,比如我想看不同时间段的不同原料
:具体要看什么值,比如销售额等

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



其实我们只需要将不同的字段拖入到不同的区域中即可,为了方便展示数据,我们可以右键关键字段,然后将其选择上移,这样我们可以实现数据的多级展示。


这里我们注意一个左下角的功能,叫做延迟布局更新,这个当我们的数据量比较大的时候,比如说十万个数据,我们就可以选定这个延迟更新,其实就是设置当我们的字段设置完成之后才进行数据更新,可以最大程度保证我们操作的流畅性。

如果我们对数据透视表的顺序有些不满意,那我们就要按照我们自己的意愿进行顺序的修改,比如说我们选择升序和降序。



当然了,我们也可以直接在选定区域的时候直接选择插入一个透视图,一般默认是柱状图。

所以我们可以与透视表进行对比一下:
筛选:你想要将什么进行分组,比如我想看一下不同供应商的一些信息,那么就是按照供应商进行筛选
:其实就是透视表当中的列值,横坐标轴是什么,一般是用时间序列值
图例:也就是系类,等同于透视表当中的行值,你想要对什么内容进行展开,比如我想看不同时间段的不同原料
:具体要看什么值,比如合格量等


这就是数据透视表与数据透视图的基本操作,这是比较简单的基础内容。

2、更改数据源

数据透视表可以随时随地进行数据源的更改,数据源变更后进行简单的更新就可反映到数据报表中,有两种方式,第一种是数据透视表刷新:如果数据源中的数值进行了更新,刷新即可。如果是数据源的结构或布局变更了,这时就采用更改数据源的方式。


3、插入计算字段

计算字段极大扩展了数据透视表的计算功能,比如原始数据表中有一列数据为销售单价,有一列数据为数量。那么在数据透视表中可以通过计算字段输入公式”=单价*数量“,来求出销售额。



区域是数据透视表的核心部分,通过数据透视表提供的强大数据计算功能,可以使用多种汇总方式和值显示方式来计算值字段数据。比如,百分比,各种比率等。

上面就是用excel来实现数据透视表的过程,它不仅可以按照不同的方式汇总数据,还可以按照不同的方式显示数据,从而更清晰的看出数据之间的关系和逻辑。

四、pandas实现数据透视表

pandas中的函数pivot_table可以实现数据透视表,它的参数如下,下面我们来一个个的学习。我们的数据源和上面excel的一样。

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

  • 参数解释【注:values、index、columns、aggfunc、最为关键,它们分别对应excel透视表中的值、行、列、值汇总方式】
data:dataframe 格式的数据
values:需要汇总计算的列,可多选,多选用[ ]
index:行分组键,一般是用于分组的列名,作为结果DataFrame的行索引
columns:列分组键,一般是用于分组的列名,作为结果DataFrame的列索引
aggfunc:聚合函数或函数列表,默认为平均值!
fill_value:设定缺失替换值
margins:是否添加行列的总计
dropna:默认为True,如果列的所有值都是NaN,将不作为计算列,False时,被保留
margins_name:汇总行列的名称,默认为All

1、读取数据
import pandas as pd
import numpy as np
df = pd.read_excel("./sales-funnel.xlsx")
df.head()

我们将上表中“Status”列定义为category,并按我们想要的查看方式设置顺序(可选)

df["Status"] = df["Status"].astype("category")
df["Status"].cat.set_categories(["won","pending","presented","declined"],inplace=True)
df.info()
2、建立简单索引
pd.pivot_table(df,index=["Name"])

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

pd.pivot_table(df,index=["Name","Rep","Manager"])
3、实现数据聚合

我们上面将“Name”,“Rep”列和“Manager”列进行对应分组,那么现在来实现数据聚合。

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)
pd.pivot_table(df,index=["Manager","Rep"],values=["Price"],aggfunc=[np.mean,len])

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


4、定义列

如果我们想通过不同产品来分析销售情况,那么变量“columns”将允许我们定义一个或多个列。
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)
5、查看总和

如何查看一些总和数据呢?相当于excel中的总计,通过“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)
6、不同值执行不同的函数

为了对你选择的不同值执行不同的函数,你可以向aggfunc传递一个字典。

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
7、透视表过滤

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

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

查看所有的暂停(pending)和成功(won)的交易,如下:

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

实现同时过滤多个条件:

希望本文的内容对大家的学习或者工作能带来一定的帮助,每天进步一点点,加油❤。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,524评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,869评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,813评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,210评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,085评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,117评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,533评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,219评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,487评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,582评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,362评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,218评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,589评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,899评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,176评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,503评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,707评论 2 335

推荐阅读更多精彩内容