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

news/2024/11/28 6:48:52/

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() * 2return 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) * 2return 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() * 2return s
print(data.agg({'counts': DoubleSum}, axis = 0))### 5、agg方法中使用的自定义函数含Numpy中的函数
## 自定义函数求两倍的和
def DoubleSum2(data):s = sum(data) * 2return 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.ppmy.cn/news/48813.html

相关文章

InnoSetup 安装程序设置环境变量

InnoSetup 通过写入注册表值实现安装程序设置系统全局环境变量 环境变量以字符串值存储在注册表中&#xff0c;因此可以使用 [Registry] 区段操作它们。系统范围的环境变量位于: "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment"…

使用datax 把数据从oracle导出到elasticsearch中

https://blog.csdn.net/mynameisjinxiaokai/article/details/128716467 一、datax需要python环境&#xff0c;需要先安装python 打开官网 https://www.python.org/downloads/ 此处下载2.6.5版本安装 添加环境变量 path C:\Python27\ 安装完成后 cmd 使用 python -V 查看是…

【python】制作一个简单的界面,有手就行的界面~

目录 前言准备工作试手小案例开始我们今天的案例教学尾语 &#x1f49d; 前言 嗨喽~大家好呀&#xff0c;这里是魔王呐 ❤ ~! ttkbootstrap 是一个基于 tkinter 的界面美化库&#xff0c; 使用这个工具可以开发出类似前端 bootstrap 风格的 tkinter 桌面程序。 ttkbootstrap …

池技术:连接池,线程池,内存池,进程池等汇总分析

引言 在软件开发中&#xff0c;经常会遇到需要频繁创建和销毁某些资源的情况。这些资源可能是内存、线程、数据库连接等。频繁地创建和销毁资源可能导致性能下降和资源浪费。为了解决这些问题&#xff0c;软件开发者设计了一种称为“池技术”的策略。本文将介绍池技术的由来、…

Hbase1.3:Hbase基础架构、Hbase基础架构角色:Master、Region Server、Zookeeper、HDFS

Hbase1.3&#xff1a;Hbase基础架构、Hbase基础架构角色&#xff1a;Master、Region Server、Zookeeper、HDFS Hbase基础架构Hbase基础架构角色1&#xff09;Master2&#xff09;Region Server3&#xff09;Zookeeper4&#xff09;HDFS Hbase基础架构 Hbase架构里面&#xff0…

15.数据表格.上

本节课我们来开始了解 Layui 的内置模块&#xff1a;table 数据表格。 一&#xff0e;基本使用 1. table 模块&#xff0c;通过异步加载数据来渲染表格来展现数据内容&#xff1b; <table id"table"></table> layui.use([table], () > { const table …

2 路 500MSPS/1GSPS/1.25GSPS 14 位直流耦合 AD 采集 FMC 子卡模块

板卡概述 FMC155 是一款基于 VITA57.1 标准的&#xff0c;实现 2 路 14-bit、 500MSPS/1GSPS/1.25GSPS 直流耦合 ADC 同步采集 FMC 子卡模 块。该模块遵循 VITA57.1 规范&#xff0c;可直接与 FPGA 载卡配合使用&#xff0c;板 卡 ADC 器件采用 ADI 的 AD9680 芯片&#xf…

React State 状态

React State(状态) React 把组件看成是一个状态机&#xff08;State Machines&#xff09;。通过与用户的交互&#xff0c;实现不同状态&#xff0c;然后渲染 UI&#xff0c;让用户界面和数据保持一致。 React 里&#xff0c;只需更新组件的 state&#xff0c;然后根据新的 s…