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

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

在这里插入图片描述

#此时得到的是一个分组对象,每个分组包含各组的子 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() 表示子序列有多少个值。

在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述

总结

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

相关推荐

  1. 数据分析-Pandas分类数据比较如何避坑

    2024-03-13 01:56:01       19 阅读
  2. 机器学习 - 不同分类模型比较

    2024-03-13 01:56:01       8 阅读
  3. 比较不同聚类方法评估指标

    2024-03-13 01:56:01       35 阅读
  4. 02-Pandas方法介绍

    2024-03-13 01:56:01       17 阅读
  5. 自动化 使用Python+pandas在数据库取值

    2024-03-13 01:56:01       28 阅读
  6. 数据分析-Pandas数据分类转换控制

    2024-03-13 01:56:01       23 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-03-13 01:56:01       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-03-13 01:56:01       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-03-13 01:56:01       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-03-13 01:56:01       18 阅读

热门阅读

  1. Spring Boot 实现文件本地以及OSS上传

    2024-03-13 01:56:01       19 阅读
  2. C++学习

    C++学习

    2024-03-13 01:56:01      24 阅读
  3. 僵尸进程和孤儿进程

    2024-03-13 01:56:01       18 阅读
  4. 从SPI协议学习PX4源码

    2024-03-13 01:56:01       19 阅读
  5. rasterio库简介及函数说明

    2024-03-13 01:56:01       21 阅读
  6. ingress

    2024-03-13 01:56:01       19 阅读
  7. 系统设计学习(一)分布式系统

    2024-03-13 01:56:01       22 阅读
  8. 直播相关——声网rtc SDK

    2024-03-13 01:56:01       27 阅读
  9. LeetCode94 二叉树的中遍历

    2024-03-13 01:56:01       19 阅读
  10. 3/11Redis学习下

    2024-03-13 01:56:01       20 阅读
  11. 关于 Conda 和 pip,你了解多少

    2024-03-13 01:56:01       27 阅读
  12. 算法训练day42leetcode01背包问题 416. 分割等和子集

    2024-03-13 01:56:01       21 阅读