• 027—pandas 不同分类每天指定取值的比例


    前言

    本例我们将进行分组计算,分组后得到一个堆叠数据,并对堆叠数据解除堆叠,最后再按要求格式化为百分数样式。
    此类操作会经常发生在业务数据透视场景下,一般都会有 Excel 来操作完成,今天我们使用 Python 的 pandas 的完成。

    需求:

    期望按 Category 分组,得到每日 Repeat 列 Y 值的占比,即 Y/(Y+N) 的百分比。

    思路:

    • 根据需求要求,要按 [‘Category’, ‘Date’] 进行分组,分组后最关键的是计算 Y 值的占比,计算占比可以写一个函数,先计算
      Y 的取值数据再除以当前组的总值数。
    • 得到的分组数据是一个堆叠形式的数据,将其解除堆叠,第二层索引会出现在行索引上。
    • 最后再利用 DataFrame 的 style 对象应用 format 方法进行百分数的格式化。

    二、使用步骤

    1.引入库

    代码如下(示例):

    import pandas as pd
    from io import StringIO
    
    • 1
    • 2

    2.读入数据

    代码如下(示例):

    data = '''
    CustomerID Category Repeat Date
    1 A Y 2022-01-10
    2 B N 2022-01-10
    3 A N 2022-02-10
    4 A N 2022-01-10
    5 B Y 2022-01-10
    6 B Y 2022-02-10
    7 A Y 2022-01-10
    8 B N 2022-02-10
    9 A Y 2022-02-10
    10 A N 2022-01-10
    11 A Y 2022-02-10
    12 B N 2022-01-10
    13 A N 2022-01-10
    14 A N 2022-02-10
    15 B Y 2022-02-10
    16 B Y 2022-01-10
    17 A Y 2022-01-10
    18 B N 2022-02-10
    19 A Y 2022-02-10
    20 A N 2022-01-10
    '''
    
    df = pd.read_csv(StringIO(data), sep=' ')
    df
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    在这里插入图片描述

    #此时得到的是一个分组对象,每个分组包含各组的子 DataFrame。在计算时,只需要 Repeat 参与计算,因此我们可以取分组对象的 Repeat 的列,就得到了几个 Repeat 分组的子 Series。
    #然后对这个分组对象应用函数:
    (
        df.groupby(['Category', 'Date'])
        .Repeat
        .apply(lambda x: (x=='Y').sum()/x.count())
    )
    # 定义的 lambda 函数中,(x=='Y') 得到一个布尔序列,代表子 Series 对应位置上的是否为 Y,
    # 由于 sum() 求值时, True 为 1,可以计算出有多少个 True,即得到有多少个值为 Y。
    # 分母上的 x.count() 表示子序列有多少个值。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    在这里插入图片描述

    #上边代码得到的结果就是按 Category 分组下的每天 Y 值的占比。由于结果是一个堆叠形式,我们使用 unstack() 解除堆叠:
    (
        df.groupby(['Category', 'Date'])
        .Repeat
        .apply(lambda x: (x=='Y').sum()/x.count())
        .unstack()
    )
    # 这样,Date 列就成为了列索引。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    在这里插入图片描述

    # 最后,使用 DataFrame 的 style 对象应用 format 方法进行百分数的格式化。
    # 最终代码为:
    (
        df.groupby(['Category', 'Date'])
        .Repeat
        .apply(lambda x: (x=='Y').sum()/x.count())
        .unstack()
        .style
        .format("{:.2%}")
    )
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    在这里插入图片描述

    总结

    以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。

  • 相关阅读:
    4.20.1 深度神经网络提高放射科医生在乳腺癌筛查中的表现
    产品设计小技能
    Java核心编程(21)
    【PyQt】多窗口使用信号-槽传递数据
    【正版系统】【正版短剧授权】海外短剧看剧系统搭建开发,海外完集短剧正版授权,外籍演员海外拍摄影视作品正版授权。
    编码器-解码器架构在AI去衣技术中的应用与探讨(附软安装包)
    你以为的推荐系统,其实只是推荐模型
    mysql数据库面试相关问题
    MySQL:锁机制 |表级锁、行级锁 | 排它锁、共享锁 | 间隙锁
    ArcGIS无插件加载(无偏移)天地图
  • 原文地址:https://blog.csdn.net/2202_76035290/article/details/136655039