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)

各个参数的解释如下:

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()

数据透视成功。这段代码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=["销售额"])

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

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)

至此,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'")