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

你可能感兴趣的:(Python Pandas Pivot_Table 如何在Python中实现数据透视表功能)