美文网首页Python学习Pandaspython学习
详解pandas数据分析之groupby分组聚合(下)

详解pandas数据分析之groupby分组聚合(下)

作者: 谦行看商业 | 来源:发表于2019-03-03 22:08 被阅读33次

    继上篇文章“[详解pandas数据分析之groupby分组聚合(上)](https://www.jianshu.com/p/692d75993064)”之后,该篇文章继续基于电商的商品数据信息,详细介绍pandas数据分析之分组聚合的方法与技巧(重在第二节聚合)。

    分组聚合结果展示:


    20181218224011339.png

    一、导入pandas包并读取数据集

    import pandas as pd
    df = pd.read_excel('./data/sku_analysis.xlsx')
    

    数据

    20181218195520228.png

    数据字段说明

    1、platform:用户使用的终端设备类型,分pc端、m端、ios端、android端。
    2、sku:某款特点商品的唯一编号。
    3、expose_num:商品sku的累计曝光数。
    4、click_num:商品sku的累计点击数。
    5、cart_num:商品sku的累计加购数。
    6、collect_num:商品sku的累计收藏数。
    7、order_num:商品sku的累计下单数。

    二、分组聚合

    一)单字段分组聚合

    目标:统计不同sku的总曝光数

    方式一(灵活性高):使用agg方法,以字典格式传入要聚合的字段和聚合函数

    df.groupby('sku').agg({'expose_num':'sum'})
    
    20181218210050234.png

    方式二:将聚合的字段作为索引,聚合函数传入agg

    df.groupby('sku')['expose_num'].agg(np.sum)
    
    20181218210236495.png

    方式三:直接将函数名作为字符串传入agg

    df.groupby('sku')['expose_num'].agg('sum')
    
    20181218210334577.png

    方式四:直接使用mean()函数

    df.groupby('sku')['expose_num'].sum()
    
    20181218210415323.png

    二)多字段分组聚合

    1、多字段分组、单字段聚合

    目标:统计不同sku在不同设备端的总曝光数

    df.groupby(['sku', 'platform'])['expose_num'].agg('sum')
    
    20181218210752657.png

    2、多字段分组、多字段聚合

    目标:统计不同sku在不同设备端的总曝光数及总点击数

    df.groupby(['sku', 'platform'])['expose_num','click_num'].agg('sum')
    
    20181218210929643.png

    3、多字段分组、多字段聚合、多个聚合函数

    1)多字段共用聚合函数

    目标:统计不同sku在不同设备端的总曝光数与平均曝光数、总点击数与平均点击数

    df.groupby(['sku', 'platform'])['expose_num','click_num'].agg(['sum','mean'])
    
    20181218211103715.png

    2)多字段各自用聚合函数

    目标:统计不同sku在不同设备端的总曝光数、平均曝光数与最小曝光数、总点击数、平均点击数与最大点击数

    df.groupby(['sku', 'platform']).agg({'expose_num':['sum','mean','min'],'click_num':['sum','mean','max']})
    
    20181218211213451.png

    4、拼接列索引

    将多级列索引自定义拼接为单级索引

    group_obj = df.groupby(['sku', 'platform']).agg({'expose_num':['sum','mean','min'],'click_num':['sum','mean','max']})
    index0 = group_obj.columns.get_level_values(0)
    index1 = group_obj.columns.get_level_values(1)
    group_obj.columns = index0 + '_' + index1
    group_obj
    
    20181218211346788.png

    5、重置行索引

    将多级行索引变为单级索引

    group_obj = df.groupby(['sku', 'platform']).agg({'expose_num':['sum','mean','min'],'click_num':['sum','mean','max']})
    group_obj.reset_index()
    
    20181218221417123.png

    等效于分组时指定as_index=False:

    df.groupby(['sku', 'platform'],as_index=False).agg({'expose_num':['sum','mean','min'],'click_num':['sum','mean','max']})
    

    三)自定义聚合函数

    1、单字段自定义函数

    agg在调用自定义函数时,直接引入自定义的函数名,字段名作为参数。

    目标:自定义函数求取各个sku的平均曝光数

    def mean_func(s):
        score = s.sum()/s.size
        return score
    df.groupby('sku')['expose_num'].agg(mean_func).round(1).head()#round(1)保留一位小数
    
    20181218212346124.png

    2、多字段自定义函数

    可同时对多个字段应用自定义函数,各个字段分别传入,分别得出结果。

    目标:自定义函数求取各个sku的平均曝光数、平均点击数、平均加购数

    def mean_func(s):
        score = s.sum()/s.size
        return score
    df.groupby('sku')['expose_num','click_num','cart_num'].agg(mean_func).round(2).head()
    
    20181218212644351.png

    3、同时传入自定义聚合函数与系统函数

    def mean_func(s):
        score = s.sum()/s.size
        return score
    df.groupby('sku')['expose_num','click_num','cart_num'].agg([mean_func,'mean']).round(2).head()
    
    20181218212741319.png

    4、修改列名

    上面自定义函数计算出的索引名为函数名,可对其作更改。

    def mean_func(s):
        score = s.sum()/s.size
        return score
    mean_func.__name__ = 'mean_1'
    df.groupby('sku')['expose_num','click_num','cart_num'].agg([mean_func,'mean']).round(2).head()
    
    2018121821292593.png

    5、实现自定义函数传参

    目标:统计数量在10000以上的频率

    def pct_func(s,low,high):
        score = s.between(low,high).mean()
        return score
    mean_func.__name__ = 'pct'
    df.groupby('sku')['expose_num','click_num','cart_num'].agg(pct_func,low=0,high=10000).round(2).head()
    
    20181218213055227.png

    6、注意事项

    注意:实现自定义函数传参的同时与内置函数共用,以下方式均会报错:

    df.groupby('sku')['expose_num','click_num','cart_num'].agg([mean,pct_func,low=0,high=10000]).round(2).head()
    
    df.groupby('sku')['expose_num','click_num','cart_num'].agg([mean,pct_func(low=0,high=10000).round(2).head()
    
    df.groupby('sku')['expose_num','click_num','cart_num'].agg(pct_func(low=0,high=10000)).round(2).head()
    

    7、自定义函数传参与内置函数共用

    要实现自定义函数传参的同时与内置函数共用,可用如下方式:(定义嵌套函数(闭包))

    def pct_func(s,low,high):
        score = s.between(low,high).mean()
        return score
    def agg_func(func,name,low,high):
         def wrapper(x):
             return func(x,low,high)
         wrapper.__name__ = name
         return wrapper
    df.groupby('sku')['expose_num','click_num','cart_num'].agg([mean,agg_func(pct_func,'pct',low=0,high=10000)]).round(2).head()
    
    20181218213600824.png

    谢谢!

    相关文章

      网友评论

        本文标题:详解pandas数据分析之groupby分组聚合(下)

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