美文网首页python
Python Pandas Pivot_Table 如何在Pyt

Python Pandas Pivot_Table 如何在Pyt

作者: YUENFUNGDATA | 来源:发表于2019-09-28 16:29 被阅读0次

    数据透视表(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 如何在Pyt

        本文链接:https://www.haomeiwen.com/subject/mixzectx.html