Groupby_SQL和pandas等效例子

news/2024/9/30 2:02:46/

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

例一

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

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

sql">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。我们想要计算每个地区的年销售总额、平均利润和最大销售额。

sql">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关键字来重命名列。


http://www.ppmy.cn/news/1532190.html

相关文章

javascript手写实现instanceof函数 介绍判断数组的方法

1 手写实现instanceof函数 instanceof 是 JavaScript 中的一个运算符,用于检测一个对象是否是某个构造函数的实例。它的语法是 object instanceof Constructor,如果 object 是 Constructor.prototype 的一个实例,返回 true,否则返…

LSTM预测未来30天销售额

加入深度实战社区:www.zzgcz.com,免费学习所有深度学习实战项目。 1. 项目简介 本项目旨在利用深度学习中的长短期记忆网络(LSTM)来预测未来30天的销售额。LSTM模型能够处理时序数据中的长期依赖问题,因此在销售额预测这类涉及时…

k8s_资源管理介绍

资源管理介绍 在k8s中,所有内容都抽象成资源,用户需要通过操作资源来管理k8s k8s本身就是一个集群系统,用户可以在集群中部署服务,在k8s集群中运行一个个的容器,将指定的程序部署到容器中 k8s最小的管理单元是pod&…

【.NET 8 实战--孢子记账--从单体到微服务】--用户(删除/修改/查询)

本文将继续讲解和用户相关的接口,包括用户的删除、修改和查询 一、需求 我们先来看一下这篇文章的目标也就是需求表: 编号需求标题需求内容1删除对某一个用户进行删除,注意:只能删除用户,和用户相关联的数据不能删除…

【C语言内存管理】第七章 内存管理中的常见问题

第七章 内存管理中的常见问题 内存管理是C语言编程中的一个关键环节,错误的内存操作容易导致严重的程序漏洞和系统崩溃问题。以下详细讨论内存管理中的常见问题,并提供相应的代码示例和预防方法。 1. 内存泄漏 内存泄漏是指程序在堆上分配内存后&…

「OC」探索 KVC 的基础与应用

「OC」KVC的初步学习 文章目录 「OC」KVC的初步学习前言介绍KVC的相关方法key和keyPath的区别KVC的工作原理KVO的setValue:forKey原理KVO的ValueforKey原理 在集合之中KVC的用法1. mutableArrayValueForKey: 和 mutableArrayValueForKeyPath:2. mutableSetValueForKey: 和 muta…

小程序振动

原生小程序: (1):震动 wx.vibrate(); (2):长震动 wx.vibrateLong(); (3):短震动 wx.vibrateShort(); uniapp: (1):震动 uni.vibrate(); (2):长震动 uni.vibrateLong(); (3):…

华为认证HCIA篇--网络通信基础

大家好呀!我是reload。今天来带大家学习一下华为认证ia篇的网络通信基础部分,偏重一些基础的认识和概念性的东西。如果对网络通信熟悉的小伙伴可以选择跳过,如果是新手或小白的话建议还是看一看,先有个印象,好为后续的…