数据透视表(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'")