4.4 使用分组聚合进行组内计算

news2024/11/19 17:54:48

4.4 使用分组聚合进行组内计算

  • 4.4.1 使用groupby方法拆分数据
    • groupby方法的参数及其说明:
    • groupby对象常用的描述性统计方法如下:
  • 4.4.2 使用agg方法聚合数据
    • agg函数和aggregate函数的参数说明
      • 1、使用agg求出当前数据对应的统计量
      • 2、使用agg分别求字段的不同统计量
      • 3、使用agg方法求不同字段的不同数目统计量
      • 4、在agg方法中使用自定义函数
      • 5、agg方法中使用的自定义函数含Numpy中的函数
      • 6、使用agg方法做简单的聚合
      • 7、使用agg方法对分组数据使用不同的聚合函数
  • 4.4.3使用apply方法聚合数据
    • apply方法的常用参数及其说明
  • 4.4.4 使用transform方法聚合数据
  • 4.4.5 任务实现
  • 数据
  • 完整代码

4.4.1 使用groupby方法拆分数据

该方法提供的是分组聚合步骤中的拆分功能,能根据索引或字段对数据进行分组
DataFrame.groupby(by=None, axis=0, level=None, as_index=True, sort=True, group_keys=True, squeeze=False, **kwargs)

groupby方法的参数及其说明:

在这里插入图片描述
by参数的特别说明
如果传入的是一个函数则对索引进行计算并分组。
如果传入的是一个字典或者Series则字典或者Series的值用来做分组依据。
如果传入一个NumPy数组则数据的元素作为分组依据。
如果传入的是字符串或者字符串列表则使用这些字符串所代表的字段作为分组依据。

# 4.4 使用分组聚合进行组内计算
## 4.4.1使用groupby方法拆分数据
import pandas as pd
import numpy as np
data = pd.read_csv('E:/Input/ptest.csv')
# print(data.head(3))
datagroup = data[['id', 'counts', 'amounts']].groupby(by='id')
print(datagroup)  # 分组后的结果并不能直接查看,而是被存在内存中,输出的是内存地址。
# <pandas.core.groupby.generic.DataFrameGroupBy object at 0x0000020717BF0DF0>

在这里插入图片描述
用groupby方法分组后的结果并不能直接查看,而是被存在内存中,输出的是内存地址。实际上分组后的数据对象GroupBy类似Series与DataFrame,是pandas提供的一种对象。

groupby对象常用的描述性统计方法如下:

在这里插入图片描述

# 可以查看groupby对象常用的描述性统计方法
print(datagroup.count())  # 分组的数目,包括缺失值
print(datagroup.max())  # 每组最大值
print(datagroup.min())  # 每组最小值

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4.4.2 使用agg方法聚合数据

agg,aggregate方法都支持对每个分组应用某函数,包括Python内置函数或自定义函数。同时这两个方法能够也能够直接对DataFrame进行函数应用操作。

 DataFrame.agg(func, axis=0, *args, **kwargs)
 DataFrame.aggregate(func, axis=0, *args, **kwargs)

agg函数和aggregate函数的参数说明

在这里插入图片描述
在正常使用过程中,agg函数和aggregate函数对DataFrame对象操作时功能几乎完全相同,因此只需要掌握其中一个函数即可。

1、使用agg求出当前数据对应的统计量

可以使用agg方法一次求出当前数据中所有菜品销量和售价的总和与均值,如detail[[‘counts’,‘amounts’]].agg([np.sum,np.mean]))。

## 使用agg方法一次求出所有销量和售价的总和与均值
print(data[['counts', 'amounts']].agg([np.sum, np.mean]))

2、使用agg分别求字段的不同统计量

对于某个字段希望只做求均值操作,而对另一个字段则希望只做求和操作,可以使用字典的方式,将两个字段名分别作为key,然后将NumPy库的求和与求均值的函数分别作为value,如detail.agg({‘counts’:np.sum,‘amounts’:np.mean}))。

## 对counts求和,对amounts求均值
print(data.agg({'counts': np.sum, 'amounts': np.mean}))

3、使用agg方法求不同字段的不同数目统计量

在某些时候还希望求出某个字段的多个统计量,某些字段则只需要求一个统计量,此时只需要将字典对应key的value变为列表,列表元素为多个目标的统计量即可,如detail.agg({‘counts’:np.sum,‘amounts’:[np.mean,np.sum]}))

## 求counts的总和,求amounts的均值和总和
print(data.agg({'counts': np.sum, 'amounts': [np.mean, np.sum]}))

4、在agg方法中使用自定义函数

在agg方法可传入自定义的函数。

## 自定义函数求两倍的和
def DoubleSum(data):
    s = data.sum() * 2
    return s
print(data.agg({'counts': DoubleSum}, axis = 0))

5、agg方法中使用的自定义函数含Numpy中的函数

使用自定义函数需要注意的是NumPy库中的函数np.mean,np.median,np.prod,np.sum,np.std,np.var能够在agg中直接使用,但是在自定义函数中使用NumPy库中的这些函数,如果计算的时候是单个序列则会无法得出想要的结果,如果是多列数据同时计算则不会出现这种问题。

## 自定义函数求两倍的和
def DoubleSum2(data):
    s = sum(data) * 2
    return s
print(data.agg({'counts': DoubleSum2}, axis = 0))
print(data[['counts', 'amounts']].agg(DoubleSum2))   #销量与售价的和的两倍

6、使用agg方法做简单的聚合

使用agg方法能够实现对每一个字段每一组使用相同的函数。

print('均值:', datagroup.agg(np.mean))
print('标准差:', datagroup.agg(np.std))

7、使用agg方法对分组数据使用不同的聚合函数

如果需要对不同的字段应用不同的函数,则可以和Dataframe中使用agg方法相同。

print(datagroup.agg({'counts':np.sum, 'amounts':np.mean}))

4.4.3使用apply方法聚合数据

apply方法类似agg方法能够将函数应用于每一列。不同之处在于apply方法相比agg方法传入的函数只能够作用于整个DataFrame或者Series,而无法像agg一样能够对不同字段,应用不同函数获取不同结果。
使用apply方法对GroupBy对象进行聚合操作其方法和agg方法也相同,只是使用agg方法能够实现对不同的字段进行应用不同的函数,而apply则不行。
DataFrame.apply(func, axis=0, broadcast=False, raw=False, reduce=None, args=(), **kwds)

apply方法的常用参数及其说明

在这里插入图片描述

#  4.4.3使用apply方法聚合数据
### 1、apply方法的基本用法
## counts和amounts的均值
print(data[['counts', 'amounts']].apply(np.mean))
### 2、使用apply方法进行聚合操作
## 订单每组的均值
print(datagroup.apply(np.mean))
## 订单每组的标准差
print(datagroup.apply(np.std))

4.4.4 使用transform方法聚合数据

transform方法能够对整个DataFrame的所有元素进行操作。且transform方法只有一个参数“func”,表示对DataFrame操作的函数。
同时transform方法还能够对DataFrame分组后的对象GroupBy进行操作,可以实现组内离差标准化等操作。
若在计算离差标准化的时候结果中有NaN,这是由于根据离差标准化公式,最大值和最小值相同的情况下分母是0。而分母为0的数在Python中表示为NaN。

# 4.4.4 使用transform方法聚合数据
### 1、使用transform方法将销量和售价翻倍
print(data[['counts', 'amounts']].transform(lambda x: x*2))
### 2、使用transform实现组内离差标准化
print(datagroup.transform(lambda x: (x.mean()-x.min())/(x.max()-x.min())))

4.4.5 任务实现

# 4.4.5 任务实现
### 1、按照时间对菜单详情表进行拆分
detail = pd.read_csv('E:/Input/ptest.csv')
# 订单详情表按照日期分组
detail['time'] = pd.to_datetime(detail['time'])  # 转换成日期格式
detail['date'] = [i.date() for i in detail['time']]  # 提取日,增加一列date
# detail.to_csv('E:/Output/detail.csv', index=False)  # 输出
detailgroup = detail[['date', 'counts', 'amounts']].groupby(by='date')
print(detailgroup.size())
### 2、使用agg方法计算单日菜品销售的平均单价和售价中位数
print(detailgroup[['amounts']].agg([np.mean, np.median]))  # 合在一起
print(detailgroup.agg({'amounts': np.mean}))  # 分开
print(detailgroup.agg({'amounts': np.median}))
print("-----+++++++++++-----")
### 3、使用apply方法统计单日菜品销售的数目
print(detailgroup['counts'].apply(np.sum))

数据

链接:https://pan.baidu.com/s/1FPQFA8JJHuezxbpQIHiZ4Q
提取码:6666

完整代码

# 4.4 使用分组聚合进行组内计算
## 4.4.1使用groupby方法拆分数据
import pandas as pd
import numpy as np
data = pd.read_csv('E:/Input/ptest.csv')
# print(data.head(3))
datagroup = data[['id', 'counts', 'amounts']].groupby(by='id')
print(datagroup)  # 分组后的结果并不能直接查看,而是被存在内存中,输出的是内存地址。 
#<pandas.core.groupby.generic.DataFrameGroupBy object at 0x0000020717BF0DF0>

# 可以查看groupby对象常用的描述性统计方法
print(datagroup.count())  # 分组的数目,包括缺失值
print(datagroup.max())  # 每组最大值
print(datagroup.min())  # 每组最小值
print(datagroup.std())  # 每组标准差
print(datagroup.size())  # 每组的大小

print('-----------------')
# 4.4.2 使用agg方法聚合数据
### 1、使用agg求出当前数据对应的统计量
## 使用agg方法一次求出所有销量和售价的总和与均值
print(data[['counts', 'amounts']].agg([np.sum, np.mean]))
### 2、使用agg分别求字段的不同统计量
## 对counts求和,对amounts求均值
print(data.agg({'counts': np.sum, 'amounts': np.mean}))
### 3、使用agg方法求不同字段的不同数目统计量
## 求counts的总和,求amounts的均值和总和
print(data.agg({'counts': np.sum, 'amounts': [np.mean, np.sum]}))
### 4、在agg方法中使用自定义函数
## 自定义函数求两倍的和
def DoubleSum(data):
    s = data.sum() * 2
    return s
print(data.agg({'counts': DoubleSum}, axis = 0))

### 5、agg方法中使用的自定义函数含Numpy中的函数
## 自定义函数求两倍的和
def DoubleSum2(data):
    s = sum(data) * 2
    return s
print(data.agg({'counts': DoubleSum2}, axis = 0))
print(data[['counts', 'amounts']].agg(DoubleSum2))   #销量与售价的和的两倍
### 6、使用agg方法做简单的聚合
print('均值:', datagroup.agg(np.mean))
print('标准差:', datagroup.agg(np.std))
### 7、使用agg方法对分组数据使用不同的聚合函数
print(datagroup.agg({'counts':np.sum, 'amounts':np.mean}))

#  4.4.3使用apply方法聚合数据
### 1、apply方法的基本用法
print(data[['counts', 'amounts']].apply(np.mean))  ## counts和amounts的均值
### 2、使用apply方法进行聚合操作
# print(datagroup.apply(np.mean))  ## 订单每组的均值
print(datagroup.apply(np.std))  ## 订单每组的标准差

# 4.4.4 使用transform方法聚合数据
### 1、使用transform方法将销量和售价翻倍
print(data[['counts', 'amounts']].transform(lambda x: x*2))
### 2、使用transform实现组内离差标准化
print(datagroup.transform(lambda x: (x.mean()-x.min())/(x.max()-x.min())))

# 4.4.5 任务实现
### 1、按照时间对菜单详情表进行拆分
detail = pd.read_csv('E:/Input/ptest.csv')
# 订单详情表按照日期分组
detail['time'] = pd.to_datetime(detail['time'])  # 转换成日期格式
detail['date'] = [i.date() for i in detail['time']]  # 提取日,增加一列date
# detail.to_csv('E:/Output/detail.csv', index=False)  # 输出
detailgroup = detail[['date', 'counts', 'amounts']].groupby(by='date')
print(detailgroup.size())
### 2、使用agg方法计算单日菜品销售的平均单价和售价中位数
print(detailgroup[['amounts']].agg([np.mean, np.median]))  # 合在一起
print(detailgroup.agg({'amounts': np.mean}))  # 分开
print(detailgroup.agg({'amounts': np.median}))
print("-----+++++++++++-----")
### 3、使用apply方法统计单日菜品销售的数目
print(detailgroup['counts'].apply(np.sum))

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

X509证书中的Subject Public Key Info

SubjectPublicKeyInfo在TBSCertificate的第七项: 对于ECC id-ecPublicKey OBJECT IDENTIFIER :: { iso(1) member-body(2) us(840) ansi-X9-62(10045) keyType(2) 1 } id-ecPublicKey 是必须的 ECParameters :: CHOICE {namedCurve OBJECT IDENTIFIER -- implicitCurve NULL -…

java day10

第10章 创建Swing界面 10.1 Swing的特性10.1.1 标准对话框1. 确认对话框2. 输入对话框3.消息对话框4. 选项对话框 10.1.2 使用对话框10.1.3 滑块10.1.4 滚动窗格10.1.5 工具栏10.1.6 进度条10.1.7 菜单10.1.8 选项卡式窗格 10.1 Swing的特性 10.1.1 标准对话框 JOptionPane类…

HTML5 <rt> 标签、HTML5 <ruby> 标签

HTML5 <rt> 标签 实例 HTML5 <rt>标签用于表示为<ruby>标签中的注释内容。 一个 ruby 注释&#xff1a; <ruby> 漢 <rt> ㄏㄢˋ </rt> </ruby> 尝试一下 浏览器支持 IE 9、Firefox、Opera、Chrome 和 Safari 支持 <rt> 标…

增广拍卖——二跳页下的拍卖机制探索

1. 引言 本文提出的方案已被WSDM 2023接收&#xff0c;论文&#xff1a;Boosting Advertising Space: Designing Ad Auctions for Augment Advertising&#xff0c; 下载&#xff1a;https://dl.acm.org/doi/abs/10.1145/3539597.3570381 信息流产品为了保障用户体验通常会严格…

关于python爬虫解析的问题

在进行Python爬虫解析时&#xff0c;需要注意以下事项&#xff1a; 1、良好的网站使用协议&#xff1a;需要遵守网站的robots.txt文件&#xff0c;以确保你的爬虫程序不会将网站拦截下来。 2、编码问题&#xff1a;需要正确设置HTTP头和解析器的编码&#xff0c;以确保爬虫程…

低代码开发重要工具:jvs-logic(逻辑引擎)可视化设计要素

逻辑引擎可视化的交互 可视化的服务编排是逻辑引擎的核心功能&#xff0c;逻辑引擎的界面可视化设计是为了方便用户使用和操作逻辑引擎而设计的。一个好的界面设计能够提高用户的工作效率和使用体验&#xff0c;同时也能增加软件的可靠性和可维护性。 以下是逻辑引擎界面可视化…

python数据分析综合案列--星巴克门店数据分析及可视化

本实训针对一组关于全球星巴克门店的统计数据&#xff0c;分析了在不同国家和地区以及中国不同城市的星巴克门店数量。 获取数据&#xff0c;数据放在directory.csv 这个案例主要分为以下几个部分&#xff1a; 数据清洗和预处理&#xff1a;使用 Pandas 进行数据清洗和预处理&…

windows下安装emscripten

Qt系列文章目录 文章目录 Qt系列文章目录前言一、Emscripten SDK介绍二、Emscripten SDK安装Get the emsdk repoEnter that directory 前言 由于Web端需要处理大量图像&#xff0c;大量图片的分辨率8k*8k&#xff0c;使用Canvas API&#xff08;画布&#xff09;是在HTML5中新…

(二)app自动化脚本录制回放

上一篇&#xff1a;(一)app自动化测试环境搭建&#xff08;maciosairtest &#xff09;_airtest环境搭建_要开朗的spookypop的博客-CSDN博客 注&#xff1a;后续都是用IOS设备来介绍自动化测试&#xff0c;安卓就不赘述了。 接上一篇&#xff0c;搭建好自动化测试环境后&#…

如何去阅读Java源码,我总结了18条心法

大家好&#xff0c;我是Martin。 这篇文章我准备来聊一聊如何去阅读开源项目的源码。 在聊如何去阅读源码之前&#xff0c;先来简单说一下为什么要去阅读源码&#xff0c;大致可分为以下几点原因&#xff1a; 最直接的原因&#xff0c;就是面试需要&#xff0c;面试喜欢问源码…

Docker实战笔记4-安装jenkins

转载请标明出处&#xff1a;http://blog.csdn.net/zhaoyanjun6/article/details/130318679 本文出自【赵彦军的博客】 文章目录 拉取 jenkins 镜像排查问题验证结果总结 拉取 jenkins 镜像 在官方镜像仓库查询 jenkins 镜像 https://hub.docker.com/r/jenkins/jenkins 拉取镜…

linux 安装php8.1 ZipArchive和libzip最新版扩展安装

1、概述 安装前咱们先看下我本地环境 [rootelk php8]# cat /etc/redhat-release Red Hat Enterprise Linux Server release 7.9 (Maipo) [rootelk php8]# [rootelk php8]# ./bin/php -v PHP 8.1.18 (cli) (built: Apr 17 2023 13:15:17) (NTS) Copyright (c) The PHP Group Z…

onnx手动操作

使用onnx.helper可以进行onnx的制造组装操作&#xff1a; 对象描述ValueInfoProto 对象张量名、张量的基本数据类型、张量形状算子节点信息 NodeProto算子名称(可选)、算子类型、输入和输出列表(列表元素为数值元素)GraphProto对象用张量节点和算子节点组成的计算图对象ModelP…

命令模式解读

问题引进 看一个具体的需求 1) 我们买了一套智能家电&#xff0c;有照明灯、风扇、冰箱、洗衣机&#xff0c;我们只要在手机上安装 app 就可以控制对这些家电工作。 2) 这些智能家电来自不同的厂家&#xff0c;我们不想针对每一种家电都安装一个 App&#xff0c;分别控制&…

HTTP相关知识

HTTP HTTP 是一种能够获取如 HTML 这样的网络资源的 protocol(通讯协议)。它是在 Web 上进行数据交换的基础&#xff0c;是一种 client-server 协议&#xff0c;也就是说&#xff0c;请求通常是由像浏览器这样的接受方发起的。一个完整的 Web 文档通常是由不同的子文档拼接而成…

苹果通讯录怎么备份?手机通讯录备份的方法看这里!

案例&#xff1a;手机通讯录怎么备份&#xff1f; 【友友们&#xff0c;想问下苹果手机的通讯录怎么样才能进行备份&#xff1f;可以解答我的疑惑吗&#xff1f;感谢&#xff01;】 在日常使用手机过程中&#xff0c;我们经常会遇到误删通讯录的情况。因此&#xff0c;备份通讯…

必须要知道的hive调优知识(上)

Hive数据倾斜以及解决方案 1、什么是数据倾斜 数据倾斜主要表现在&#xff0c;map/reduce程序执行时&#xff0c;reduce节点大部分执行完毕&#xff0c;但是有一个或者几个reduce节点运行很慢&#xff0c;导致整个程序的处理时间很长&#xff0c;这是因为某一个key的条数比其…

QT QPainter坐标变换绘图实例(五角星绘制)

1、绘制3个五角星的程序 创建一个基于 QWidget 的窗口的应用程序 &#xff0c;窗体上不放置任何组件。在 Widget 类的构造函数和paintEvent0事件中编写代码&#xff0c;代码内容如下。 Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget) {ui->setupUi(…

Keil生成.bin文件

1. 打开OptionsforTarget 对话框&#xff1a; 2 选择User&#xff1a; 3. 根据User页的配置还要配置Output页面&#xff0c;具体如下&#xff1a; 4. 点击OK确定&#xff0c;然后再重新编译则会按照上图中的配置路径生成.bin格式的文件了&#xff1a; Keil自带的fromelf.exe工具…

D. Ehab and the Expected XOR Problem(构造 + 异或和)

Problem - D - Codeforces 给出两个整数nn和xx&#xff0c;构造一个满足以下条件的数组&#xff1a; 对于数组中的任何元素aiai&#xff0c;1≤ai<2n1≤ai<2n&#xff1b; 没有非空的子段&#xff0c;其位数XOR值等于00或xx、 它的长度ll应该是最大的。 一个序列bb是一个…