代码改变世界
[登录 · 注册]
  • 【Python】Pivot_table透视表用法及CategoricalDtype自定义排序
  • 一,Pivot 及 Pivot_table函数用法

    Pivot和Pivot_table函数都是对数据做透视表而使用的。其中的区别在于Pivot_table可以支持重复元素的聚合操作,而Pivot函数只能对不重复的元素进行聚合操作。

    在一般的日常业务中,因为Pivot_table的功能更为强大,Pivot能做的不能做的Pivot_table都可做。所以只需要记住Pivot_table函数用法就好了。

    Pivot函数的使用演示

    #%%
    
    import pandas as pd
    
    df01 = pd.DataFrame(
        {
            "年份":[2019,2019,2019,2020,2020,2020],
            "平台":["京东","淘宝","拼多多","京东","淘宝","拼多多"],
            "销量":[100,200,300,400,500,600]
        }
    )
    
    df01
    
    #%%
    
    pd.pivot(df01,
             index = "年份",
             columns = "平台",
             values = "销量")
    
    #%%

    聚合后结果

    Pivot_table函数的使用演示

    注释:index指定什么元素作为index显示,columns指定列,values指定统计的值。一般values都为int后者float类型的值。aggfunc为聚合函数可以指定(mean,sum,Min,Max等统计运算等函数,如果不指定默认为mean均值)

    df02 = pd.DataFrame(
        {
            "年份":[2019,2019,2019,2019,2020,2020,2020,2020],
            "平台":["京东","淘宝","淘宝","拼多多","京东","淘宝","拼多多","拼多多"],
            "销量":[100,200,300,400,500,600,700,800]
        }
    )
    df02
    
    #%%
    
    #pivot_table用的很多.因为可以对重复的元素进行聚合操作.而pivot函数只能对不重复的行进行运算
    
    pd.pivot_table(df02,
                   index="年份",
                   columns="平台",
                   values="销量",
                   aggfunc=sum #聚合函数来对销量进行运算.可以指定最大,最小,平均值等函数.默认为mean平均值
    )
    
    #%%

    聚合结果

    对比结果:这里要强调一点的是,2020年平台为拼多多的数据出现了2次,而且2次的值不同。在pivot函数中是无法对这种重复平台的数据进行聚合的,但是Pivot_table则可以。

                     另外通过聚合函数aggfunc指定sum求和,可以把2次的值累加统计。

    Pivot_table函数真实案例演示

    1. 读取表格数据

    #%%
    
    df = pd.read_excel("./datas/result_datas.xlsx",
                      ).convert_dtypes()   #读取数据并自动转化type
    df.dtypes
    
    #%%
    
    df.head(3)
    
    #%%

    2. 通过Pivot_table函数透视合并数据并对金额和数量做统计

    因为涉及到敏感信息,因此服务卡卡号等敏感信息部分遮掩不显示。但是通过部分结果也可以看出是按照号码进行升序排序的

    #按照自定义指定index,columns,values值
    result = pd.pivot_table(df,
                   index = ["姓名","服务卡卡号","明细","规格"],
                   values = ["理赔金额(元)","数量"],
                   aggfunc=sum
                   )
    result = result.sort_values("服务卡卡号") #按照指定values值排序
    result
    
    #%%
    
    #输出到文件
    result.to_excel("./datas/output_datas.xlsx")
    print("Done!!!")

    二,CategoricalDtype自定义排序

    当我们的透视表生成完毕后,有很多情况下需要我们对某列或某行值进行排序。排序有很多种方法。例如sort_index及sort_values函数也可以对数据进行排序,这里就不多说了。

    对于数值和字母的排序很容易,但是对于中文的排序就有点麻烦了。默认情况下是按照utf-8的编码来进行排序的但是即使如此也很难满足我们对汉字排序的要求。所以通过CategoricalDtye可以把数据类型转成Category类型

    然后通过指定参数列表的顺序来自定义那个元素先那个元素后,完全取决于你把那个元素放在List的前面,这样就大大方便了我们对中文排序的操作。

    代码如下:

    1. 自动生成DataFrame数据

    #%%
    
    import pandas as pd
    from datetime import datetime
    
    city =["上海","北京","深圳","杭州","苏州","青岛","大连","齐齐哈尔","大理","丽江",
              "天津","济南","南京","广州","无锡","连云港","张家界"]
    
    #创建自动从list中选取valuse值的get_list函数
    #replace=True代表允许选出的元素重复
    def get_list(items,size=20):
        return pd.Series(items).sample(n=size,replace=True).to_list()
    
    #通过get_list自动生成数据,最终生成一个DataFrame
    df = pd.DataFrame({
         "城市":get_list(city),
         "仓位":get_list(["经济舱","商务舱","头等舱"]),
         "航线":get_list(["单程","往返"]),
         "日期": get_list([datetime(2020,8,1),datetime(2020,8,2),
                         datetime(2020,8,3),datetime(2020,8,4)]),
         "时间": get_list(["09:00 - 12:00",
                            "13:00 - 15:30",
                            "06:30 - 15:00",
                            "18:00 - 21:00",
                            "20:00 - 23:20",
                            "10:00 - 15:00"]),
         "航空公司": get_list(["东方航空","南方航空","深圳航空","山东航空","中国航空"]),
         "出票数量":get_list([10,15,20,25,30,35,40,45,50,55,60]),
        })
    #%%
    df

    结果如下:

    2. 查看数据类型

    #%%
    df.dtypes

    3.  自定义数据类型(Category)按照指定顺序排序,并通过透视表展示数据

    #%%
    #自定义type,以及自定义排序的顺序
    my_type = pd.CategoricalDtype(
        categories=["头等舱","商务舱","经济舱"],
        ordered=True
    )
    df["仓位"] = df["仓位"].astype(my_type)  #将指定列转成自定义的type
    df.dtypes
    #%%
    #通过透视表统计数据
    tb = pd.pivot_table(
        df,
        index=["城市","仓位","航线","日期","时间"],
        values="出票数量",
        aggfunc=sum
    )
    tb

    先查看数据类型:可以看出仓位的数据类型已经从Object变成了category类型了。

    结果为:

    分析上述数据可以看出,我们把仓位按照["头等舱","商务舱","经济舱"]的顺序进行了排序,排序结果也是按照这个顺序排列的,成功的满足了我们对中文列自定义排序的需求。

    通过Pivot_table函数更加清晰的对原有数据进行了展示。也可以按照自己的需求展示其中的一部分数据。这样对数据的清洗及展示变得更加的灵活。

  • 上一篇:【Python】where cut query melt函数用法
    下一篇:【Python】Merge函数的用法
  • 【推广】 阿里云小站-上云优惠聚集地(新老客户同享)更有每天限时秒杀!
    【推广】 云服务器低至0.95折 1核2G ECS云服务器8.1元/月
    【推广】 阿里云老用户升级四重礼遇享6.5折限时折扣!
  • 原文:https://www.cnblogs.com/liupengpengg/p/13559861.html
走看看 - 开发者的网上家园