当前位置: 首页 > news >正文

Groupby_SQL和pandas等效例子

在SQL中使用PARTITION BY与在Pandas中使用groupby().agg()有一定的相似性,因为它们都是用于分组数据并对每组应用某种聚合函数。

例一

下面将给出一个SQL的例子和等效的Pandas代码。

SQL 示例
假设我们有一个名为employees的表,包含以下列:id, department_id, salary。我们想要计算每个部门的平均工资。

SELECT department_id, AVG(salary) AS average_salary
FROM employees
GROUP BY department_id;

这个查询将返回每个部门的ID和该部门的平均工资。
Pandas 示例
在Pandas中,我们可以使用groupby()方法来分组数据,然后使用agg()方法来应用聚合函数。

import pandas as pd
# 假设df是包含员工数据的DataFrame
# df = pd.read_csv('employees.csv')  # 如果数据来自CSV文件
data = {'id': [1, 2, 3, 4, 5],'department_id': [101, 102, 101, 102, 103],'salary': [50000, 60000, 55000, 65000, 70000]
}
df = pd.DataFrame(data)# 使用groupby().agg()计算每个部门的平均工资
average_salary = df.groupby('department_id')['salary'].agg('mean').reset_index()
average_salary.columns = ['department_id', 'average_salary']print(average_salary)

在这个Pandas示例中:
• groupby(‘department_id’): 根据department_id列对数据进行分组。
• [‘salary’]: 指定我们想要聚合的列。
• .agg(‘mean’): 应用平均值聚合函数。
• reset_index(): 将结果转换回常规的DataFrame格式。
• columns = [‘department_id’, ‘average_salary’]: 重命名结果DataFrame的列。
等效性
• SQL的GROUP BY department_id对应于Pandas的groupby(‘department_id’)。
• SQL的AVG(salary)对应于Pandas的.agg(‘mean’)。

说明

在Pandas中,agg()方法非常灵活,允许你一次性应用多个聚合函数,或者对不同的列应用不同的聚合函数。例如:

# 计算每个部门的平均工资和最大工资
department_stats = df.groupby('department_id').agg({'salary': ['mean', 'max']
}).reset_index()
# 重命名列
department_stats.columns = ['department_id', 'average_salary', 'max_salary']
print(department_stats)

在这个例子中,我们对salary列应用了两个不同的聚合函数:mean和max。

例二

我们将对三列应用三种不同的聚合函数,并对结果进行重命名。

SQL 示例
假设我们有一个名为sales的表,包含以下列:id, region_id, year, sales_amount, profit。我们想要计算每个地区的年销售总额、平均利润和最大销售额。

SELECT region_id,SUM(sales_amount) AS total_sales,AVG(profit) AS average_profit,MAX(sales_amount) AS max_sales
FROM sales
GROUP BY region_id;

Pandas 示例
在Pandas中,我们可以使用groupby()方法来分组数据,然后使用agg()方法来应用多个聚合函数,并使用rename()方法来重命名列。

import pandas as pd
data = {'id': [1, 2, 3, 4, 5],'region_id': [101, 102, 101, 102, 101],'year': [2020, 2021, 2020, 2021, 2022],'sales_amount': [10000, 20000, 15000, 25000, 30000],'profit': [2000, 4000, 3000, 5000, 6000]
}
df = pd.DataFrame(data)
# 使用groupby().agg()计算每个地区的年销售总额、平均利润和最大销售额
result = df.groupby('region_id').agg({'sales_amount': 'sum',  # 年销售总额'profit': 'mean',        # 平均利润'sales_amount': 'max'   # 最大销售额
}).rename(columns={'sales_amount__sum': 'total_sales', 'sales_amount__max': 'max_sales'})
# 重命名利润列
result.columns = ['region_id', 'total_sales', 'average_profit', 'max_sales']
print(result)

还可以用以下方法同时重命名!!!

df.groupby("region").agg(total_sales=pd.NamedAgg(column="sales_amount", aggfunc="sum"),average_profit=pd.NamedAgg(column="profit", aggfunc="mean"), max_sales=pd.NameAgg(column="sales_amount", aggfunc="max")
)

解释

  1. SQL:
    • SUM(sales_amount) AS total_sales: 计算每个地区的年销售总额。
    • AVG(profit) AS average_profit: 计算每个地区的平均利润。
    • MAX(sales_amount) AS max_sales: 计算每个地区的最大销售额。
  2. Pandas:
    • groupby(‘region_id’): 根据region_id列对数据进行分组。
    • .agg({‘sales_amount’: ‘sum’, ‘profit’: ‘mean’, ‘sales_amount’: ‘max’}): 对sales_amount列应用求和和最大值聚合函数,对profit列应用平均值聚合函数。
    • rename(columns={‘sales_amount__sum’: ‘total_sales’, ‘sales_amount__max’: ‘max_sales’}): 重命名列。
注意事项

在Pandas中,当对同一列应用多个聚合函数时,列名会被自动添加后缀(例如sales_amount__sum),需要使用rename方法进行重命名。
• 在SQL中,可以直接使用AS关键字来重命名列。

相关文章:

  • 数据结构7—树(顺序存储二叉树—堆)含TOPK问题
  • OpenCV视频I/O(1)视频采集类VideoCapture介绍
  • YOLOv9改进,YOLOv9主干网络替换为GhostNetV3(2024年华为提出的轻量化架构,全网首发),助力涨点
  • 作家依靠AI一年内创作120部作品
  • 微信小程序实战教程:轻松实现列表批量选择功能
  • Python自然语言处理之spacy模块介绍、安装与常见操作案例
  • 从零开始手写STL库:Stack
  • 【质优价廉】GAP9 AI算力处理器赋能智能可听耳机,超低功耗畅享未来音频体验!
  • 【C语言内存管理】第三章 堆内存管理
  • 《ToDesk 云电脑、易腾云、青椒云移动端体验实测:让手机秒变超级电脑》
  • ARM 服务器上安装 OpenEuler (欧拉)
  • 银河麒麟桌面操作系统V10登录闪退问题解决
  • python并发编程实战
  • R 语言 | 取数据框一列子集时,如何保持数据框结构?drop=F
  • 【Python】YOLO牛刀小试:快速实现视频物体检测
  • [分享]iOS开发-关于在xcode中引用文件夹右边出现问号的解决办法
  • Apache Pulsar 2.1 重磅发布
  • React 快速上手 - 06 容器组件、展示组件、操作组件
  • React-Native - 收藏集 - 掘金
  • Vue.js-Day01
  • WordPress 获取当前文章下的所有附件/获取指定ID文章的附件(图片、文件、视频)...
  • 爱情 北京女病人
  • 第十八天-企业应用架构模式-基本模式
  • 诡异!React stopPropagation失灵
  • 聚簇索引和非聚簇索引
  • 蓝海存储开关机注意事项总结
  • 什么软件可以提取视频中的音频制作成手机铃声
  • 通过几道题目学习二叉搜索树
  • 王永庆:技术创新改变教育未来
  • Spring第一个helloWorld
  • 数据库巡检项
  • ​configparser --- 配置文件解析器​
  • ​Kaggle X光肺炎检测比赛第二名方案解析 | CVPR 2020 Workshop
  • # wps必须要登录激活才能使用吗?
  • # 学号 2017-2018-20172309 《程序设计与数据结构》实验三报告
  • #我与虚拟机的故事#连载20:周志明虚拟机第 3 版:到底值不值得买?
  • (20)docke容器
  • (BFS)hdoj2377-Bus Pass
  • (delphi11最新学习资料) Object Pascal 学习笔记---第13章第1节 (全局数据、栈和堆)
  • (LLM) 很笨
  • (阿里云万网)-域名注册购买实名流程
  • (规划)24届春招和25届暑假实习路线准备规划
  • (几何:六边形面积)编写程序,提示用户输入六边形的边长,然后显示它的面积。
  • (十二)devops持续集成开发——jenkins的全局工具配置之sonar qube环境安装及配置
  • (十三)Maven插件解析运行机制
  • (四)js前端开发中设计模式之工厂方法模式
  • (一)、软硬件全开源智能手表,与手机互联,标配多表盘,功能丰富(ZSWatch-Zephyr)
  • (原创)boost.property_tree解析xml的帮助类以及中文解析问题的解决
  • (总结)Linux下的暴力密码在线破解工具Hydra详解
  • .jks文件(JAVA KeyStore)
  • .NET MAUI学习笔记——2.构建第一个程序_初级篇
  • .NET MVC、 WebAPI、 WebService【ws】、NVVM、WCF、Remoting
  • .NET6 开发一个检查某些状态持续多长时间的类
  • .set 数据导入matlab,设置变量导入选项 - MATLAB setvaropts - MathWorks 中国
  • .vue文件怎么使用_vue调试工具vue-devtools的安装