[黑马程序员Pandas教程]——分组与分箱

目录:

  1. 学习目标
  2. 分组对象DataFrameGroupBy
    1. 数据准备
    2. df.groupby分组函数返回分组对象
    3. 分组对象其他API
      1. 取出每组第一条或最后一条数据
      2. 获取分组后每组的名称
      3. gs.get_group()按分组依据获取其中一组
  3. 分组聚合
    1. 分组后直接聚合
    2. 分组后指定单列或多列聚合
    3. 分组后使用多个聚合函数
    4. 分组后对多列分别使用不同的聚合函数
    5. 分组后使用自定义聚合函数
  4. 分组转换聚合
    1. 分组后指定列数据转换聚合
    2. 分组后使用自定义函数进行转换聚合
    3. 分组聚合和分组转换的区别
  5. 分组过滤
  6. 数据离散化(分箱)
  7. 总结
  8. 项目地址:

1.学习目标

  • 知道Pandas分组聚合的使用方法

  • 知道Pandas分组转换聚合的使用方法

  • 知道Pandas分组过滤的使用方法

  • 知道Pandas数据离散化分箱操作的使用方法

2.分组对象DataFrameGroupBy

数据准备
  • 加载优衣库的销售数据集,包含了不同城市优衣库门店的所有产品类别的销售记录,数据字段说明如下

    • store_id 门店随机id

    • city 城市

    • channel 销售渠道 网购自提 门店购买

    • gender_group 客户性别 男女

    • age_group 客户年龄段

    • wkd_ind 购买发生的时间(周末,周间)

    • product 产品类别

    • customer 客户数量

    • revenue 销售金额

    • order 订单数量

    • quant 购买产品的数量

    • unit_cost 成本(制作+运营)

import pandas as pd

df = pd.read_csv('../datas/data_set/uniqlo.csv')
print(df)
df.groupby分组函数返回分组对象
  • 基于一列进行分组

import pandas as pd

df = pd.read_csv('../datas/data_set/uniqlo.csv')
print(df)

# 基于顾客性别分组
gs = df.groupby(['gender_group'])
print(gs)
print(gs['city'])
  • 基于多列进行分组

import pandas as pd

df = pd.read_csv('../datas/data_set/uniqlo.csv')
print(df)

# 基于顾客性别、不同城市分组
gs2 = df.groupby(['gender_group', 'city'])
print(gs2)
  • 返回的分组对象可以直接使用,或选择一列做聚合、转换、过滤操作;比如我们要计算不同性别、不同城市的顾客的平均销售金额

import pandas as pd

df = pd.read_csv('../datas/data_set/uniqlo.csv')
print(df)

# 按性别、城市分组后,选择销售金额列,做平均数计算
print(df.groupby(['gender_group', 'city'])['revenue'].mean())
分组对象其他API
取出每组第一条或最后一条数据
import pandas as pd

df = pd.read_csv('../datas/data_set/uniqlo.csv')
print(df)

gs2 = df.groupby(['gender_group', 'channel'])
# 取出每组第一条数据
print(gs2.first())
# 取出每组最后一条数据
print(gs2.last())
获取分组后每组的名称
import pandas as pd

df = pd.read_csv('../datas/data_set/uniqlo.csv')
print(df)

gs2 = df.groupby(['gender_group', 'channel'])

print(gs2.grouper.result_index)
print(gs2.grouper.result_index.tolist())
gs.get_group()按分组依据获取其中一组
import pandas as pd

df = pd.read_csv('../datas/data_set/uniqlo.csv')
print(df)

gs2 = df.groupby(['gender_group', 'channel'])

print(gs2.get_group(('Female', '线上')))

3.分组聚合

分组后直接聚合
  • 分组后直接进行聚合计算并返回df
df.groupby(['列名1', '列名2']).聚合函数()
  • 按性别分组,计算每组的各数值列的平均值

import pandas as pd

df = pd.read_csv('../datas/data_set/uniqlo.csv')
print(df)

print(df.groupby(['gender_group'])[['store_id', 'customer', 'revenue', 'order', 'quant', 'unit_cost']].mean())
分组后指定单列或多列聚合
  • 根据1列或多列的值进行分组,后每一组都对指定列的值使用聚合函数(比如mean求平均值)进行计算;分组后指定1列返回series对象,指定多列返回dataframe对象
df.groupby(['列名1', '列名2'])['指定列1'].聚合函数()
df.groupby(['列名1', '列名2'])['指定列1', '指定列2'].聚合函数()
  • 计算不同城市的销售额总和

import pandas as pd

df = pd.read_csv('../datas/data_set/uniqlo.csv')
print(df)

print(df.groupby(['city'])['revenue'].sum())

 

分组后使用多个聚合函数
  • 同时使用多个内置聚合函数,全部放入一个Python列表, 然后把整个列表传入agg或aggregate函数中;返回以分组列作为索引,每一个聚合计算结果作为列的全新df
df.groupby(['列名1', '列名2'])['指定列1', '指定列2'].agg(['max', 'min']) 
# max, min 为pandas内置的聚合函数名
  • 按城市和线上线下划分,计算销售金额、成本的总和和平均值

import pandas as pd

df = pd.read_csv('../datas/data_set/uniqlo.csv')
print(df)

print(df.groupby(['city', 'channel'])[['revenue', 'unit_cost']].agg(['sum', 'mean']))

 

分组后对多列分别使用不同的聚合函数
  • agg函数中可以传入字典,字典的key是df的列名,与key对应的value是pandas内置的聚合计算函数、其名称的字符串;;返回以分组列作为索引,每一个聚合计算结果作为列的全新df
df.groupby(['列名1', '列名2']).agg({
    '指定列1':'mean', 
    '指定列2':'sum', 
    '指定列3':'mean'
})
  • 按城市和线上线下划分,分别计算销售金额的平均值、成本的总和

import pandas as pd

df = pd.read_csv('../datas/data_set/uniqlo.csv')
print(df)

print(df.groupby(['city', 'channel']).agg({
    'revenue': 'mean',
    'unit_cost': 'sum'
}))

 

分组后使用自定义聚合函数
  • 分组之后指定列,对该列的值使用自定义的函数;返回series对象
def bar(s, args1, args2):
    '''自定义函数
    s,为传入的series对象
    args1,args2为自定义传参
    '''
    s_mean = s.sum() / s.size
    return s_mean + args1 + args2
# 调用自定义函数
df.groupby(['列名1', '列名2']).agg(bar, args1=xxx, args2=xxx)
df.groupby(['列名1', '列名2'])['指定列1', '指定列2'].agg(bar, args1=xxx, args2=xxx)
  • 按线上线下及不同城市划分,计算每组销售金额、成本的平均值,要求使用自定义聚合函数

import pandas as pd

df = pd.read_csv('../datas/data_set/uniqlo.csv')
print(df)


def foo(s):
    # 参数s 是分组之后指定的每一列
    s_mean = s.sum() / s.size
    return s_mean


print(df.groupby(['channel', 'city'])[['revenue', 'unit_cost']].agg(foo))

# 与下面的代码效果相同
# print(df.groupby(['channel', 'city'])[['revenue', 'unit_cost']].mean())

 

4.分组转换聚合

分组后指定列数据转换聚合
  • 分组后,对指定列的值做聚合计算,只返回计算结果,不返回分组情况
df.groupby(['列名1', '列名2'])[['指定列1', '指定列2']].transform('sum') # sum是pandas内置聚合函数的函数名,求和
  • 根据城市、性别分组,再计算每组销售金额、成本的平均值

import pandas as pd

df = pd.read_csv('../datas/data_set/uniqlo.csv')
print(df)

print(df.groupby(['city', 'gender_group'])[['revenue', 'unit_cost']].transform('mean'))
分组后使用自定义函数进行转换聚合
  • transform使用自定义的函数,注意此时传入的函数名没有引号
# 自定义一个计算函数
def foo(x, y):
    return x + y
df.groupby('列名1')['列名2'].transform(foo, y=3)
  • 根据城市、性别分组,再计算每组销售金额、成本的平均值;要求使用自定义函数

import pandas as pd

df = pd.read_csv('../datas/data_set/uniqlo.csv')
print(df)


def foo(s):
    return s.sum() / s.size


print(df.groupby(['city', 'gender_group'])[['revenue', 'unit_cost']].transform(foo))
分组聚合和分组转换的区别
  • 二者返回对象的长度不同
import pandas as pd

df = pd.read_csv('../datas/data_set/uniqlo.csv')
print(df)

print(df.groupby('city')['revenue'].transform('mean'))
print(df.groupby('city')['revenue'].mean())
# 前者返回结果的数据数量对应df的所有行,一一对应
# 后者返回的结果数据仅对应分组的个数
# 二者返回结果的长度不同

 

5.分组过滤

  • 分组后接filter方法,filter传入一个返回布尔值的匿名函数,该函数的入参就是groupby分组之后的每一组数据或是每组选中的一列数据,返回False的数据会被过滤掉
df.groupby(['列名1',...]).filter(
    lambda x: dosomething returun True or False
)
  • 按城市分组,查询每组销售金额平均值大于200的全部数据,并获取索引值

import pandas as pd

df = pd.read_csv('../datas/data_set/uniqlo.csv')
print(df)

print(df.groupby(['city']).filter(lambda s: s['revenue'].mean() > 200))
# df.groupby(['city']).filter(lambda s: s['revenue'].mean() > 200).index.tolist()
print(df.groupby(['city'])['revenue'].filter(lambda s: s.mean() > 200))
# df.groupby(['city'])['revenue'].filter(lambda s: s.mean() > 200).index.tolist()

 6.数据离散化(分箱)

  • pd.cut()函数用来把一组数据分割成离散的区间。比如有一组年龄数据,可以使用pandas.cut将年龄数据分割成不同的年龄段并打上标签。上述过程又叫做分箱
pd.cut(x=Seriers对象, bins=3, labels=['低', '中', '高'])
  • 离散化分箱函数的常用参数有:

    • x 指定离散化(分箱)依据的列,Seriers对象

    • bins 分为几组,int类型,也可以传入分组区间的列表

    • labels 每组的标签名称,按数值由小到大的顺序

    • right 默认True:左开右闭;False:左闭右开

    • include_lowest 默认False:不包含第一个分组的起始值;True:包含

  • 按成本金额大小分为3组,将每条数据都打上高中低的标签

import pandas as pd

df = pd.read_csv('../datas/data_set/uniqlo.csv')
print(df)

# 复制数据集
df2 = df.copy()
# 分箱返回Seriers对象并复制给新的列
df2['成本高中低'] = pd.cut(x=df['unit_cost'], bins=3, labels=['低', '中', '高'])
# df2['成本高中低'] = pd.cut(x=df['unit_cost'], bins=[-1,20,50,999], labels=['低', '中', '高'])
# 查看数据集
print(df2)

7.总结

  • 分组对象

    • gs = df.groupby(['列1', '列2']) 按照列1、列2的值对数据集进行分组,返回分组对象

    • gs.first() 返回每组的第一条数据

    • gs.last() 返回每组的最后一条数据

    • gs.grouper.result_index 获取全部组名

    • gs.get_group((组名)) 按照

  • 分组聚合

    • 分组后直接聚合

      df.groupby(['列名1', '列名2']).聚合函数()
    • 分组后指定单列或多列聚合

      df.groupby(['列名1', '列名2'])['指定列'].聚合函数()
    • 分组后使用多个聚合函数

      df.groupby(['列名1', '列名2'])['指定列1', '指定列2'].agg(['max', 'min'])
    • 分组后对多列分别使用不同的聚合函数

      df.groupby(['列名1', '列名2']).agg({
          '指定列1':'mean', 
          '指定列2':'sum', 
          '指定列3':'mean'
      })
    • 分组后使用自定义聚合函数

      def foo(s):
          # 参数s 是分组之后指定的每一列
          s_mean = s.sum() / s.size
          return s_mean
      df.groupby(['列名1', '列名2'])['指定列1', '指定列2'].agg(foo)
  • 分组转换

    • 分组后指定列数据转换

      df.groupby(['列名1', '列名2'])['指定列1', '指定列2'].transform('pandas内置聚合函数的函数名')
    • 分组后使用自定义函数进行转换聚合

      def foo(x, y):
          return x + y
      df.groupby('列名1')['列名2'].transform(foo, y=3)
  • 分组聚合和分组转换的区别:二者返回结果的长度不同

    • 分组转换返回结果的数据数量对应df的所有行,一一对应

    • 分组聚合返回的结果数据仅对应分组的个数

  • 分组过滤

    # 匿名函数入参就是groupby分组之后的每一组数据或是每组选中的一列数据,返回False的数据会被过滤掉
    df.groupby(['列名1',...]).filter(
        lambda x: dosomething returun True or False
    )
  • 数据离散化(分箱)用来把一组数据分割成若干个离散的区间。比如有一组年龄数据,可以使用pandas.cut将年龄数据分割成不同的年龄段并打上标签。上述过程又叫做分箱。

    • 参数x 指定离散化(分箱)依据的列,Seriers对象

    • 参数bins 分为几组,int类型,也可以传入分组区间的列表

    • 参数labels 每组的标签名称,按数值由小到大的顺序

    • 参数right 默认True:左开右闭;False:左闭右开

    • 参数include_lowest 默认False:不包含第一个分组的起始值;True:包含

    • pd.cut(x=Seriers对象, bins=3, labels=['低', '中', '高'])
    • pd.cut(x=Seriers对象, bins=[0,10,20,999], labels=['低', '中', '高']) 

8.项目地址:

 Python: 66666666666666 - Gitee.com

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/129664.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Sprint Boot 学习路线 3

嵌入式服务器 Spring Boot 的嵌入式服务器功能是一项方便而强大的功能,它允许你在应用程序中直接运行 Web 服务器,无需将其部署到单独的独立 Web 服务器中。这使得开发、测试和部署 Web 应用程序变得容易,而且它还是轻量级的、易于启动和停止…

linuxC语言缓冲区及小程序的实现

文章目录 1.文件缓冲区1.1介绍1.2缓冲文件系统1.3冲刷函数fflush1.4认识linux下的缓冲区 2.linux小程序的实现2.1 回车\r和换行\n2.2倒计时程序2.3进度条小程序sleep/usleep代码运行结果 1.文件缓冲区 1.1介绍 为缓和 CPU 与 I/O 设备之间速度不匹配,文件缓冲区用以…

【Maven教程】(十):使用 Hudson 进行持续集成—— 从Hudson的安装到任务创建 ~

Maven 使用 Hudson 进行持续集成 1️⃣ 持续集成的作用、过程和优势2️⃣ Hudson 简介与安装3️⃣ 准备 Subversion 仓库4️⃣ Hudson 的基本系统设置5️⃣ 创建 Hudson 任务5.1 Hudson 任务的基本配置5.2 Hudson 任务的源码仓库配置5.3 Hudson 任务的构建触发配置5.4 Hudson …

python之SPC:计算Cpk

目录 1、Ca、Cp和Cpk的理解 2、python计算Cp,Cpk与Pp,Ppk 3、总结 1、Ca、Cp和Cpk的理解 Ca、Cp和Cpk是制程能力指数,它们分别代表制程准确度、制程精密度和制程能力指数。 制程准确度(Ca)反映实际平均值与规格中心值之一致性。对于单边…

GF0-57CQD-002 测量参数:加速度、速度、位移–现场可配置

GF0-57CQD-002 测量参数:加速度、速度、位移–现场可配置 GF0-57CQD-002 是一款创新的双通道变送器,专为精确的振动测量而设计。它激励并读取来自加速度计的信号,并将整体振动值作为电流/电压信号传输。它测量加速度、速度和位移等不同参数的振动。配置…

竞赛 车道线检测(自动驾驶 机器视觉)

0 前言 无人驾驶技术是机器学习为主的一门前沿领域,在无人驾驶领域中机器学习的各种算法随处可见,今天学长给大家介绍无人驾驶技术中的车道线检测。 1 车道线检测 在无人驾驶领域每一个任务都是相当复杂,看上去无从下手。那么面对这样极其…

Vxe table - 基于Vue的宝藏级 table 组件

文章目录 前言一、Vxe-table功能点计划 二,安装三,引入四,示例用法 前言 对于表格来说,也许我们会遇到一个需求就是表格中的单元格可编辑,如果我们使用的是ElementUI也许不太好办,因为官方没有可编辑的这个…

Spring封装数据结果

Spring封装数据结果 POST请求JSON格式 基本数据类型 public class Demo {private byte aByte;private short aShort;private int anInt;private long aLong;private float aFloat;private double aDouble;private char aChar;private boolean aBoolean; }没有传键 封装时就会…

【Spring】SpringBoot配置文件

SpringBoot配置文件 配置文件作用SpringBoot配置文件配置文件快速入手配置文件的格式properties配置文件说明基本语法读取配置文件properties缺点分析 yml配置文件说明yml基本语法yml使用进阶yml配置读取配置对象配置集合配置Mapyml优缺点 配置文件作用 计算机上有数以千计的配…

Unity 一些内置宏定义

在Unity中,有一些内置的宏定义可用于不同的平台。以下是一些常见的平台内置宏定义: 1、UNITY_EDITOR:在Unity编辑器中运行。 2、UNITY_EDITOR_WIN:在Unity编辑器运行在Windows操作系统时被定义。 3、UNITY_STANDALONE&#xff1a…

Linux学习第37天:Linux I2C 驱动实验(一):哥俩好

Linux版本号4.1.15 芯片I.MX6ULL 大叔学Linux 品人间百味 思文短情长 世界上的很多事物都是成双成对出现的。也包括在驱动开发的过程中,比如I2C中其实就是数据线和时钟线的相互配合才能完成的。 I2C常用于连接各种外设、…

Ubuntu 22.04 安装水星无线 USB 网卡

我的 USB 网卡是水星 Mercury 的, 在 Ubuntu 22.04 下面没有自动识别。 没有无线网卡的时候只能用有线接到路由器上,非常不方便。 寻思着把无线网卡驱动装好。折腾了几个小时装好了驱动。 1.检查网卡类型 & 安装驱动 使用 lsusb 看到的不一定是准确…

node插件MongoDB(四)—— 库mongoose 的条件控制(三)

文章目录 前言一、运算符二、逻辑运算1. $or 逻辑或2. $and 逻辑与 三、正则匹配 前言 在mongodb 不能使用 > < > < ! 等运算符&#xff0c;需要使用替代符号。 一、运算符 > 使用 $gt< 使用 $lt> 使用 $gte< 使用 $lte! 使用 $ne 例子&#xff1a;获…

Mysql 一步到位实现插入或替换数据(REPLACE INTO语句)

单条数据插入/替换 比如有一个数据表叫test_table&#xff0c;包含: 主键&#xff1a;key_id数据&#xff1a;value 运行&#xff1a; REPLACE INTO test_table (key_id,value) VALUES ("id_1","value_1"); REPLACE INTO test_table (key_id,value) VAL…

Qt 各种数据类型

目录 1. 基础类型 2. log 输出 3. 字符串类型 3.2 QByteArray 构造函数 数据操作 子字符串查找和判断 遍历 查看字节数 类型转换 3.3 QString 4. QVariant 4.1 标准类型 4.2 自定义类型 5. 位置和尺寸 5.1 QPoint 5.2 QLine 5.3 QSize 5.4 QRect 6. 日期和…

gcc [linux]

目录 背景知识 gcc如何完成 格式 预处理&#xff08;进行宏替换&#xff09; 编译&#xff08;生成汇编&#xff09; 汇编&#xff08;生成机器可执行码&#xff09; 连接&#xff08;生成可执行文件或库文件&#xff09; 函数库 静态库 静态链接优势 动态库 动态链…

Wsl2 Ubuntu在不安装Docker Desktop情况下使用Docker

目录 1. 前提条件 2.安装Distrod 3. 常见问题 3.1.docker compose 问题无法使用问题 3.1. docker-compose up报错 参考文档 1. 前提条件 win10 WSL2 Ubuntu(截止202308最新版本是20.04.xx) 有不少的博客都是建议直接安装docker desktop&#xff0c;这样无论在windows…

C#开发的OpenRA游戏之世界存在的属性(1)

C#开发的OpenRA游戏之世界存在的属性(1) 在游戏里,由于存在雷达,那么每个物品就可以在雷达上显示出来,但是雷达上显示不同的部分物品时,会采用不同的颜色来显示,那么它又是怎么样实现这种不同物品进行不同的颜色显示呢? 可以仔细观看下图: 可以看到矿产显示为绿色,…

C语言之文件操作(剩余部分)

上篇博客字数到极限了&#xff0c;给大家把内容补充在这一篇&#xff0c;我们还剩下文件读取结束的判定和文件缓冲区的内容没有介绍&#xff0c;让我们开始下面的学习吧&#xff01; 目录 1.文件读取结束的判定 1.1feof函数 1.2ferror函数 代码示例 2.文件缓冲区 2.1fflu…

Android T 实现简易的 USB Mode Select 需求

Android T 实现 USB Mode Select 需求 一、实现效果 二、主要实现思路 在手机连接 USB 发生/取消通知的同时&#xff0c;控制弹窗 Dialog 的显示/消失。 三、主要代码实现 连接 USB 发送/取消的主要实现是在 UsbDeviceManager.java 类中。类路径如下&#xff1a; system/f…