Python数据分析:分组转换transform方法

大家好,在数据分析中,需要对数据进行分组统计与计算,Pandas的groupby功能提供了强大的分组功能。transform方法是groupby中常用的转换方法之一,它允许在分组的基础上进行灵活的转换和计算,并将结果与原始数据保持相同的结构。因此,transform非常适合需要将计算结果返回到原始DataFrame的情况。

1.transform方法基本概念

transform方法可以对每个分组进行计算,并将结果“广播”回原始DataFrame,使得返回的DataFrame形状与原始数据一致。与其他groupby操作不同,transform返回的数据不会改变原始DataFrame的行数,而是将分组后的计算结果逐行赋值给原始DataFrame。

transform方法的基本语法如下:

DataFrame.groupby('列名')['列名'].transform(func)
  • groupby('列名'):指定需要分组的列。

  • transform(func):对每个分组应用函数func,可以是内置的聚合函数,也可以是自定义函数。

常见的聚合函数包括求均值(mean)、求和(sum)、最大值(max)、最小值(min)等。

2.示例数据集

使用一个包含员工信息的示例数据集,包括员工姓名、部门和薪资信息,方便演示各种transform操作。

import pandas as pd# 创建示例数据集
data = {'姓名': ['Alice', 'Bob', 'Charlie', 'David', 'Eve', 'Frank'],'部门': ['销售', '销售', 'IT', 'IT', '市场', '市场'],'薪资': [7000, 6800, 9000, 8500, 7500, 7700]
}
df = pd.DataFrame(data)
print("原始数据集:\n", df)

结果如下所示:

        姓名    部门    薪资
0     Alice    销售  7000
1       Bob    销售  6800
2   Charlie    IT    9000
3     David    IT    8500
4       Eve    市场  7500
5     Frank    市场  7700

3.分组计算并广播结果

假设希望计算每个部门的平均薪资,并将该值赋予每位员工。使用transform方法可以实现这点,计算部门平均薪资并广播:

# 使用 transform 计算每个部门的平均薪资
df['部门平均薪资'] = df.groupby('部门')['薪资'].transform('mean')
print("部门平均薪资:\n", df)

结果如下所示:

        姓名    部门    薪资    部门平均薪资
0     Alice    销售  7000  6900.0
1       Bob    销售  6800  6900.0
2   Charlie    IT    9000  8750.0
3     David    IT    8500  8750.0
4       Eve    市场  7500  7600.0
5     Frank    市场  7700  7600.0

在这个示例中,transform('mean')计算了每个部门的平均薪资,并将计算结果广播回原始DataFrame的每一行中。

4.使用自定义函数进行转换

transform不仅支持常规的聚合函数,还支持自定义函数。假设计算每位员工的薪资与部门平均薪资的差异,可以使用自定义函数实现。

# 自定义函数计算薪资与部门平均薪资的差异
df['薪资差异'] = df.groupby('部门')['薪资'].transform(lambda x: x - x.mean())
print("薪资差异:\n", df)

结果如下所示:

        姓名    部门    薪资    部门平均薪资   薪资差异
0     Alice    销售  7000  6900.0    100.0
1       Bob    销售  6800  6900.0   -100.0
2   Charlie    IT    9000  8750.0    250.0
3     David    IT    8500  8750.0   -250.0
4       Eve    市场  7500  7600.0   -100.0
5     Frank    市场  7700  7600.0    100.0

通过自定义lambda函数,计算了每位员工的薪资差异,进一步揭示了员工与部门平均水平的偏差情况。

5.transform与apply的区别

transform:返回的结果与原始DataFrame的形状一致,每个分组的计算结果会逐行赋值给原DataFrame。

apply:通常返回缩小后的DataFrame,适合整体的分组操作。

以下示例展示了applytransform的差异:

# 使用 apply 计算每个部门的薪资均值
df_apply = df.groupby('部门')['薪资'].apply(lambda x: x.mean())
print("使用 apply 结果:\n", df_apply)

结果如下所示:

部门
IT    8750.0
市场    7600.0
销售    6900.0
Name: 薪资, dtype: float64

apply直接返回分组后的平均薪资,而transform会将分组后的均值按行赋回原DataFrame。transform的输出与原DataFrame形状一致,因此适合需要广播结果的计算。

6.transform方法的高级应用

6.1 计算每位员工的部门排名

可以使用transformrank函数计算每位员工在其部门内的薪资排名:

# 计算每位员工的部门薪资排名
df['部门薪资排名'] = df.groupby('部门')['薪资'].transform('rank', ascending=False)
print("部门薪资排名:\n", df)

结果如下所示:

        姓名    部门    薪资    部门平均薪资   薪资差异   部门薪资排名
0     Alice    销售  7000  6900.0    100.0     1.0
1       Bob    销售  6800  6900.0   -100.0     2.0
2   Charlie    IT    9000  8750.0    250.0     1.0
3     David    IT    8500  8750.0   -250.0     2.0
4       Eve    市场  7500  7600.0   -100.0     2.0
5     Frank    市场  7700  7600.0    100.0     1.0

在这个示例中,transform('rank')计算了每位员工在其部门内的薪资排名。

6.2 归一化处理:按部门归一化薪资

归一化处理通常用于数据预处理,使数据更加集中和标准化。以下代码展示如何按部门对薪资进行归一化:

# 按部门归一化薪资
df['归一化薪资'] = df.groupby('部门')['薪资'].transform(lambda x: (x - x.min()) / (x.max() - x.min()))
print("按部门归一化薪资:\n", df)

结果如下所示:

        姓名    部门    薪资    部门平均薪资   薪资差异   部门薪资排名  归一化薪资
0     Alice    销售  7000  6900.0    100.0     1.0    1.0
1       Bob    销售  6800  6900.0   -100.0     2.0    0.0
2   Charlie    IT    9000  8750.0    250.0     1.0    1.0
3     David    IT    8500  8750.0   -250.0     2.0    0.0
4       Eve    市场  7500  7600.0   -100.0     2.0    0.0
5     Frank    市场  7700  7600.0    100.0     1.0    1.0

在这个示例中,使用lambda函数实现了归一化操作 (x - x.min()) / (x.max() - x.min()),将每个部门的薪资归一化到[0, 1]区间。归一化后的薪资可以更直观地比较不同部门内部的薪资差异。

6.3 标准化处理:按部门标准化薪资

标准化是数据预处理中的另一种常用方法,通常用于使数据符合正态分布。以下代码展示如何按部门对薪资进行标准化:

# 按部门标准化薪资
df['标准化薪资'] = df.groupby('部门')['薪资'].transform(lambda x: (x - x.mean()) / x.std())
print("按部门标准化薪资:\n", df)

结果如下所示:

        姓名    部门    薪资    部门平均薪资   薪资差异   部门薪资排名  归一化薪资  标准化薪资
0     Alice    销售  7000  6900.0    100.0     1.0    1.0      0.707
1       Bob    销售  6800  6900.0   -100.0     2.0    0.0     -0.707
2   Charlie    IT    9000  8750.0    250.0     1.0    1.0      0.707
3     David    IT    8500  8750.0   -250.0     2.0    0.0     -0.707
4       Eve    市场  7500  7600.0   -100.0     2.0    0.0     -0.707
5     Frank    市场  7700  7600.0    100.0     1.0    1.0      0.707

在这个示例中,使用transform方法对每个部门的薪资进行标准化处理 (x - x.mean()) / x.std(),从而将数据转换为均值为0、标准差为1的分布,方便不同部门之间的薪资比较。

transform方法为Pandas的分组操作提供了强大的支持,适用于在分组基础上进行灵活的逐行计算和结果广播。本文通过实例展示transform的基本用法、自定义函数的应用、分组排名、归一化和标准化等场景。通过掌握transform的使用技巧,可以使数据处理和分析更加高效和灵活。 

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

小程序19-微信小程序的样式和组件介绍

在小程序中不能使用 HTML 标签,也就没有 DOM 和 BOM,CSS 也仅支持部分选择器 小程序提供了 WXML 进行页面结构的编写,WXSS 进行页面的样式编写 WXML 提供了 view、text、image、navigator等标签构建页面结构,小程序中标签称为组件…

VMD + CEEMDAN 二次分解,CNN-LSTM预测模型

往期精彩内容: 时序预测:LSTM、ARIMA、Holt-Winters、SARIMA模型的分析与比较 全是干货 | 数据集、学习资料、建模资源分享! EMD变体分解效果最好算法——CEEMDAN(五)-CSDN博客 拒绝信息泄露!VMD滚动分…

《生成式 AI》课程 第3講 CODE TASK 任务3:自定义任务的机器人

课程 《生成式 AI》课程 第3講:訓練不了人工智慧嗎?你可以訓練你自己-CSDN博客 我们希望你创建一个定制的服务机器人。 您可以想出任何您希望机器人执行的任务,例如,一个可以解决简单的数学问题的机器人0 一个机器人&#xff0c…

SOLIDWORKS Toolbox:一键自动化,让紧固件与零部件管理更高效

紧固件广泛应用于从手机到火箭的各种产品中。在SOLIDWORKS设计时,通过使用实际的CAD模型来包含和跟踪紧固件是最简便和全面的方法,这有助于理解设计的整体,并自动管理零件数据和设计文档,如工程图和物料清单(BOM)。 在SOLIDWORKS…

串口DMA接收不定长数据

STM32F767—>串口通信接收不定长数据的处理方法_stm32串口超时中断-CSDN博客 STM32-HAL库串口DMA空闲中断的正确使用方式解析SBUS信号_stm32 hal usart2 dma-CSDN博客 #define USART1_RxBuffSize 100 extern DMA_HandleTypeDef hdma_usart1_rx; //此处声明的变量在…

git简介和本地仓库创建,并提交修改。git config init status add commit

一、Git简介和本地仓库组成 1.1 git简介 视频教程在这 git简介,版本控制系统,工作区,暂存区,本地仓库_哔哩哔哩_bilibili 如下图,比如我们写毕业论文,要经常修改和完善,得靠自己保存&#x…

鸿蒙学习生态应用开发能力全景图-赋能套件(1)

文章目录 赋能套件鸿蒙生态应用开发能力全景图 赋能套件 鸿蒙生态白皮书: 全面阐释了鸿蒙生态下应用开发核心理念、关键能力以及创新体验,旨在帮助开发者快速、准确、全面的了解鸿蒙开发套件给开发者提供的能力全景和未来的愿景。 视频课程: 基于真实的开发场景,提供向导式…

vue+svg圆形进度条组件

vuesvg圆形进度条组件 一、实现思路二、ProgressCircle.vue三、父组件使用四、实现效果 一、实现思路 使用svg的circle元素画两个圆形&#xff0c;一个圆形控制进度&#xff0c;一个绘制底色 二、ProgressCircle.vue 代码示例&#xff1a; <template><!-- 圆形进度…

软件测试 —— 自动化基础

目录 前言 一、Web 自动化测试 1.什么是 Web 自动化测试 2.驱动 3.安装驱动管理 二、Selenium 1.简单 web 自动化测试示例 2.工作原理 三、元素定位 1.cssSelector 2.XPath 四、操作测试对象 1.点击/提交对象 2.模拟按键输入 3.清除文本内容 4.获取文本信息 5.…

基于SpringBoot的旅游网站(程序+数据库+报告)

基于SpringBoot的旅游网站&#xff0c;系统包含两种角色&#xff1a;管理员、用户,系统分为前台和后台两大模块&#xff0c;主要功能如下。 【前台】&#xff1a; - 首页&#xff1a;展示旅游网站的核心内容&#xff0c;包括推荐的旅游线路、最新的旅游资讯等。 - 旅游线路&am…

RabbitMQ教程:路由(Routing)(四)

文章目录 RabbitMQ教程&#xff1a;路由&#xff08;Routing&#xff09;&#xff08;四&#xff09;一、引言二、基本概念2.1 路由与绑定2.2 Direct交换机2.3 多绑定2.4 发送日志2.5 订阅 三、整合代码3.1 EmitLogDirectApp.cs3.2 ReceiveLogsDirectApp.cs3.3 推送所有和接收e…

AntFlow:一款高效灵活的开源工作流引擎

AntFlow 是一款功能强大、设计优雅的开源工作流引擎&#xff0c;其灵感来源于钉钉的工作流设计理念&#xff0c;旨在为企业和开发者提供灵活、高效的工作流解决方案。AntFlow 支持复杂的业务流程管理&#xff0c;具有高度可定制性&#xff0c;且拥有现代化的前端设计&#xff0…

游戏引擎学习第13天

视频参考:https://www.bilibili.com/video/BV1QQUaYMEEz/ 改代码的地方尽量一张图说清楚吧,懒得浪费时间 game.h #pragma once #include <cmath> #include <cstdint> #include <malloc.h>#define internal static // 用于定义内翻译单元内部函数 #…

中仕公考怎么样?事业编面试不去有影响吗?

事业编考试笔试已经通过&#xff0c;但是面试不去参加会有影响吗&#xff1f; 1. 自动放弃面试资格&#xff1a;未能按时出席事业单位的面试将被视为主动放弃该岗位的竞争机会。 2. 个人信誉问题&#xff1a;面试作为招聘流程的关键步骤&#xff0c;无故缺席可能被解释为诚信…

ElasticSearch学习笔记二:使用Java客户端

一、前言 在上一篇文章中&#xff0c;我们对ES有了最基本的认识&#xff0c;本着实用为主的原则&#xff0c;我们先不学很深的东西&#xff0c;今天打算先学习一下ES的Java客户端如何使用。 二、创建项目 1、普通Maven项目 1、创建一个Maven项目 2、Pom文件 <dependenc…

使用 Grafana api 查询 Datasource 数据

一、使用grafana 的api 接口 官方API 二、生成Api key 点击 Administration -》Users and accss -》Service accounts 进入页面 点击Add service account 创建 service account 点击Add service account token 点击 Generate token , 就可以生成 api key 了 三、进入grafana…

机器学习-36-对ML的思考之机器学习研究的初衷及科学研究的期望

文章目录 1 机器学习最初的样子1.1 知识工程诞生(专家系统)1.2 知识工程高潮期1.3 专家系统的瓶颈(知识获取)1.4 机器学习研究的初衷2 科学研究对机器学习的期望2.1 面向科学研究的机器学习轮廓2.2 机器学习及其应用研讨会2.3 智能信息处理系列研讨会2.4 机器学习对科学研究的重…

深入List集合:ArrayList与LinkedList的底层逻辑与区别

目录 一、前言 二、基本概念 三、相同之处 四、不同之处 五、ArrayList 底层 六、LinkedList 底层 七、ArrayList 应用场景 八、LinkedList 应用场景 九、ArrayList和LinkedList高级话题 十、总结 一、前言 在Java集合的广阔舞台上&#xff0c;ArrayList与LinkedLis…

python实现十进制转换二进制,tkinter界面

目录 需求 效果 代码实现 代码解释 需求 python实现十进制转换二进制 效果 代码实现 import tkinter as tk from tkinter import messageboxdef convert_to_binary():try:# 获取输入框中的十进制数decimal_number int(entry.get())# 转换为二进制binary_number bin(de…

关于强化学习的一份介绍

在这篇文章中&#xff0c;我将介绍与强化学习有关的一些东西&#xff0c;具体包括相关概念、k-摇臂机、强化学习的种类等。 一、基本概念 所谓强化学习就是去学习&#xff1a;做什么才能使得数值化的收益信号最大化。学习者不会被告知应该采取什么动作&#xff0c;而是必须通…