Python Pandas Pivot_Table 如何在Python中实现数据透视表功能

数据透视表(Pivot Table)是一种交互式的表,可以进行某些计算,如求和与计数等,其所进行的计算与数据跟数据透视表中的排列有关。

在Excel中我们可以轻而易举地实现数据透视表功能,“插入——数据透视表——拖动选项——完成透视表”。

那么在Python中也能实现数据透视表功能吗?答案是肯定的。本文旨在介绍Python Pandas中实现数据透视表功能的函数Pivot_table,并用实例解析它的参数设置及使用方法。

首先,观看官方文档对pandas.pivot_table函数的解释:

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

各个参数的解释如下:


参数太多难理解?没关系,接下来将以实例的方式解析pivot_table函数及参数来帮助大家理解并使用。

案例实践:

1、导入相关库

import pandas as pd
import numpy as np

python实现透视表功能的pivot_table函数主要需要两个库pandas和numpy。

2、导入要进行透视的数据文件

df=pd.read_excel("C:\\Users\\Administrator\\Desktop\\pivot_table\\销售数据源.xlsx")

导入excel xlsx格式的文件需要使用read_excel函数,若是csv格式则使用read_csv函数,括号内为文件路径,保存为df。

3、查看刚刚导入数据的情况

df.head()

以上结果显示,数据成功导入了python

4、以账号站点归类做个简单的透视表

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

数据透视成功。这段代码pivot_table有两个函数,一个是df,另一个是index。df是之前导入的数据,index是要设置的索引。

但是还有两个问题:
一是team和周数不应该出现在这里的,猜想原因可能是python误将team和周数的数字识别为数值并对其进行了运算但我们并不需要。
二是销售额小数点后的尾数太多了,能不能保留小数点后两位。

解决方法为,转换team和周数的数据类型,转成 category类别 类型即可解决,这样python就不会将其识别为数值并计算。

5、转化 team周数 的数据类型为category类型,将销售额保留小数点后两位

df["team"]=df["team"].astype("category")
df["周数"]=df["周数"].astype("category")
df["销售额"]=df["销售额"].round(2)

6、这时再看看数据转化类型成功了没有

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

team和周数的数据列消失了,转化类型成功解决了这个问题。但是小数点的问题还没有解决...

7.pivot_table函数的参数values

values为数值列,是对数据进行聚合。

pd.pivot_table(df,index=["站点"],values=["销售额"])

在这里values只设置了销售额,结果也只显示了销售额。可以看出,我们可以通过values选择控制要进行聚合的数值列。

8、完整地补充所有index和values

pd.pivot_table(df,index=["账号","站点","K3代码","运营大类","大类","品牌","机型","款式","颜色","事业部","team","周数"],values=["销售额","销量","订单数"])

这一步结束后发现,小数点后两位的问题解决了,保留了小数点后两位。

9、pivot_table函数的参数columns

现在,我要通过不同周数来分析销售情况,那么参数columns将允许我们定义一个或多个列。

解决方法:columns=["周数"] 将周数从index参数中抽出放进columns参数中

pd.pivot_table(df,index=["账号","站点","K3代码","运营大类","大类","品牌","机型","款式","颜色","事业部","team"],columns=["周数"],values=["销售额","销量","订单数"])

结果看到,销售额、销量、订单数根据周数均分成了四小列,能够更直观看出产品每一周销售情况的变化。

10、pivot_table函数的参数aggfunc

这个参数很重要。你是想对数据列进行求和?还是求均值?求最大值或最小值?aggfunc可以帮到你。

aggfunc可以用列表list或字典dic来设置。

(1)列表方法

pd.pivot_table(df,index=["账号","站点","K3代码","运营大类","大类","品牌","机型","款式","颜色","事业部","team"],columns=["周数"],values=["销售额","销量","订单数"],aggfunc=[np.sum])

以上是"销售额","销量","订单数"对数值均进行了求和运算。

那如果我想同时对"销售额求和","销量求均值","订单数求最大值",这样可不可以呢?可以的,用字典dict来设置。

(2)字典方法

pd.pivot_table(df,index=["账号","站点","K3代码","运营大类","大类","品牌","机型","款式","颜色","事业部","team"],columns=["周数"],values=["销售额","销量","订单数"],aggfunc={"销售额":np.sum,"销量":np.mean,"订单数":max})

因此设置aggfunc显得十分重要,它明确规定了运算方式,才能得到期望的运算结果。

11、pivot_table函数的参数fill_value

在上个步骤,可以发现数据透视表表中有许多非数值(NaN),填充非数值(NaN)可以使用参数fill_value

pd.pivot_table(df,index=["账号","站点","K3代码","运营大类","大类","品牌","机型","款式","颜色","事业部","team"],columns=["周数"],values=["销售额","销量","订单数"],aggfunc={"销售额":np.sum,"销量":np.mean,"订单数":max},fill_value=0)

从结果可以看到,fill_value=0,非数值(NaN)全部被填充为0。

12、pivot_table函数的参数margins

你有一个新的需求,领导想看到销售情况各项数据的总值,而不是现在的一行行数据,如何新增一列汇总值列?

解决方法:增加汇总列——使用参数margins。(margins默认为False,可以设置为True开启汇总列的计算)

pd.pivot_table(df,index=["账号","站点","K3代码","运营大类","大类","品牌","机型","款式","颜色","事业部","team"],columns=["周数"],values=["销售额","销量","订单数"],aggfunc={"销售额":np.sum,"销量":np.mean,"订单数":max},fill_value=0,margins=True)

可以看到,"销售额","销量","订单数"的后面均出现一列"All",以及最下一行出现汇总行。这就是margins=True的作用。

当然,你觉得"All"的名称不好看,可以自定义汇总列的名称,需要用到参数margins_name,如margins_name="订单数汇总"。


13、pivot_table函数的最后一个参数dropna

dropna=True 的意思为不包括条目全部为NaN的列,即一列的数据如果全部为NaN则被删除。(默认为False)

pd.pivot_table(df,index=["账号","站点","K3代码","运营大类","大类","品牌","机型","款式","颜色","事业部","team"],columns=["周数"],values=["销售额","销量","订单数"],aggfunc={"销售额":np.sum,"销量":np.mean,"订单数":max},fill_value=0,margins=True,margins_name="汇总",dropna=True)

总结:

至此,pivot_table的所有参数的使用方法和实例均已介绍完,大家可以根据自己项目的需求灵活使用这些参数。

最后复习一遍:
pandas.pivot_table (data, index=None, columns, values, aggfunc, fill_value, margins, margins_name, dropna)

还没结束

最后的问题:数据透视表是做好了,但是我们怎么筛选条件查询其中的某行数据呢?

首先、将上述做好的透视表保存到变量table中

table=pd.pivot_table(df,index=["账号","站点","K3代码","运营大类","大类","品牌","机型","款式","颜色","事业部","team"],columns=["周数"],values=["销售额","销量","订单数"],aggfunc={"销售额":np.sum,"销量":np.mean,"订单数":max},fill_value=0,margins=True,margins_name="汇总",dropna=True)

然后、查询需要用到query()函数

table.query("站点=='US'")

结果显示,成功查询到US站点的所有数据。

单个条件筛选知道怎么写了,那么多个筛选条件又要怎么写?

table.query("(账号=='CC')&(站点=='US')")

解析:query函数中,条件用括号含括,多个条件之间用&连接,筛选结果符合实际期望。

至此本文结束。

参考文献:https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.pivot_table.html

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

推荐阅读更多精彩内容