[每日一练]利用左右指定键连接实现经理的下属员工数量

该题目来自于力扣:

1731. 每位经理的下属员工数量 - 力扣(LeetCode)

题目要求:

表:Employees+-------------+----------+
| Column Name | Type     |
+-------------+----------+
| employee_id | int      |
| name        | varchar  |
| reports_to  | int      |
| age         | int      |
+-------------+----------+
employee_id 是这个表中具有不同值的列。
该表包含员工以及需要听取他们汇报的上级经理的 ID 的信息。 有些员工不需要向任何人汇报(reports_to 为空)。对于此问题,我们将至少有一个其他员工需要向他汇报的员工,视为一个经理。编写一个解决方案来返回需要听取汇报的所有经理的 ID、名称、直接向该经理汇报的员工人数,以及这些员工的平均年龄,其中该平均年龄需要四舍五入到最接近的整数。返回的结果集需要按照 employee_id 进行排序。结果的格式如下:示例 1:输入:
Employees 表:
+-------------+---------+------------+-----+
| employee_id | name    | reports_to | age |
+-------------+---------+------------+-----+
| 9           | Hercy   | null       | 43  |
| 6           | Alice   | 9          | 41  |
| 4           | Bob     | 9          | 36  |
| 2           | Winston | null       | 37  |
+-------------+---------+------------+-----+
输出:
+-------------+-------+---------------+-------------+
| employee_id | name  | reports_count | average_age |
+-------------+-------+---------------+-------------+
| 9           | Hercy | 2             | 39          |
+-------------+-------+---------------+-------------+
解释:
Hercy 有两个需要向他汇报的员工, 他们是 Alice and Bob. 他们的平均年龄是 (41+36)/2 = 38.5, 四舍五入的结果是 39.
示例 2:输入: 
Employees 表:
+-------------+---------+------------+-----+ 
| employee_id | name    | reports_to | age |
|-------------|---------|------------|-----|
| 1           | Michael | null       | 45  |
| 2           | Alice   | 1          | 38  |
| 3           | Bob     | 1          | 42  |
| 4           | Charlie | 2          | 34  |
| 5           | David   | 2          | 40  |
| 6           | Eve     | 3          | 37  |
| 7           | Frank   | null       | 50  |
| 8           | Grace   | null       | 48  |
+-------------+---------+------------+-----+ 
输出: 
+-------------+---------+---------------+-------------+
| employee_id | name    | reports_count | average_age |
| ----------- | ------- | ------------- | ----------- |
| 1           | Michael | 2             | 40          |
| 2           | Alice   | 2             | 37          |
| 3           | Bob     | 1             | 37          |
+-------------+---------+---------------+-------------+

思路流程:

首先它要求返回员工的统计数量和年龄聚合,我们可以提前把聚合函数写出来,在考虑表的连接。利用reports_to列进行分组,保留所有有老板的员工,再用agg函数对员工的数量和年龄的平均进行聚合,这里我叫它表A。在分组聚合后,我们发现,表A中的reports_to列和原表格的employee_id列相符(经理的名字也在雇员列中),我们可以想到左右的指定键连接。保留表A的所有数据,将表A的reports_to列和源数据的employee_id列进行左右连接,即可实现要求。

代码实现:

 1)进行分组聚合和重命名

import pandas as pddef count_employees(employees: pd.DataFrame) -> pd.DataFrame:a=employees.groupby('reports_to').agg({'employee_id':'count','age':'mean'}).rename(columns={'age':'average_age','employee_id':'reports_count'}).reset_index()return a

这里我们实现了人数的聚合和年龄平均的计算,由于分组的参数是reports_to列,它会被作为内索引,为后续操作更明了,我使用了reset_index()来将该列显示了出来。

| reports_to | reports_count | average_age |
| ---------- | ------------- | ----------- |
| 9          | 2             | 38.5        |

可见保留了三列:reports_to列,重命名后的age列和employee_id列

2)进行左右指定键的连接

import pandas as pddef count_employees(employees: pd.DataFrame) -> pd.DataFrame:a=employees.groupby('reports_to').agg({'employee_id':'count','age':'mean'}).rename(columns={'age':'average_age','employee_id':'reports_count'}).reset_index()    a=a.merge(employees,how='left',left_on='reports_to',right_on='employee_id')return a

这里我们用左连接(表A在左边)完全保留表A的所有数据,之后用left_on和right_on来让表A的reports_to列和原表格的employee_id进行连接,这样就可以找出包含下属员工的数量,下属员工的平均年龄,以及经理的年龄和ID的列了

| reports_to_x | reports_count | average_age | employee_id | name  | reports_to_y | age |
| ------------ | ------------- | ----------- | ----------- | ----- | ------------ | --- |
| 9            | 2             | 38.5        | 9           | Hercy | null         | 43  |

可见所有的数据此时都完全聚合到了一块,我们最难的任务也就基本完成了,接下来就需要我们取出并且变形我们需要的列,再把他们展示出来即可。

3)平均年龄的四舍五入需求

我们遇到一个很棘手的问题,要把平均年龄进行四舍五入,用后缀.round(0)肯定是不行的,它只会把小数点后的所有数据到消除,那么如何实现呢?用int可以,int也会取整,但如果小数位大于5的数据再加一个0.5,那么它的整数为肯定会进一;如果小数位小于5的数据再加一个0.5,那么它的整数位不会进一,这时候再用int进行取整就会实现四舍五入了。利用apply(lambda x:int(x+.05))即可遍历实现四舍五入的要求:

import pandas as pddef count_employees(employees: pd.DataFrame) -> pd.DataFrame:a=employees.groupby('reports_to').agg({'employee_id':'count','age':'mean'}).rename(columns={'age':'average_age','employee_id':'reports_count'}).reset_index()a=a.merge(employees,how='left',left_on='reports_to',right_on='employee_id')a['average_age']=a['average_age'].apply(lambda x:int(x+0.5))return a[['employee_id','name','reports_count','average_age']]

总结:

该题目难在我们可能不会想到左右的指定键位连接,从而使进程陷入停滞。还是要多加练习,把各种连接内化于心,才可以更从容的面对更多复杂的需求

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

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

相关文章

【区块链】POS(Proof of Stake)权益证明算法深度解析

🌈个人主页: 鑫宝Code 🔥热门专栏: 闲话杂谈| 炫酷HTML | JavaScript基础 ​💫个人格言: "如无必要,勿增实体" 文章目录 POS(Proof of Stake)权益证明算法深度解析引言1. POS基本…

Bash sleep随机时间

在 Bash 中,如果你想让 sleep 命令等待一个随机的时间,你可以使用 $RANDOM 变量来生成一个随机数,然后将其转换为秒数。但是,$RANDOM 生成的数字范围是从 0 到 32767,这可能对于你想要的等待时间来说太大了。 为了得到…

【代码随想录】【算法训练营】【第42天】 [1049]最后一块石头的重量II [494]目标和 [474]一和零

前言 思路及算法思维,指路 代码随想录。 题目来自 LeetCode。 day 42,周二,坚持一下~ 题目详情 [1049] 最后一块石头的重量II 题目描述 1049 最后一块石头的重量II 解题思路 前提:最多只会剩下一块 石头,求此…

生命在于学习——Python人工智能原理(3.5)

三、深度学习 9、常见神经网络 常见的神经网络有卷积神经网络(AlexNet、VGGNet)、循环神经网络(RNN) 长短时记忆网络(LSTM)。 (1)AlexNet AlexNet于2012年由Hinton学生Alex提出&a…

SqlServer添加索引

1. 聚集索引(Clustered Index) 描述:表数据按照索引顺序实际存储。适用场景:数据经常需要排序或范围查询,比如按日期排序的查询。优点: 提高排序和范围查询性能。一个表只能有一个聚集索引,但可…

uniapp顶部导航栏实现自定义功能按钮+搜索框并监听响应事件

目录 第一步:先下载按钮需要展示的图标(若不使用图标,直接使用文字可跳过这步) 1、点击需要的图标,添加入库 2、点击旁边的购物车,在弹出的窗口中选择下载代码 3、解压下载的压缩包,将这几个…

文章解读与仿真程序复现思路——电网技术EI\CSCD\北大核心《考虑绿证—碳交易的多能互补综合能源系统电—热—气协同低碳优化调度 》

本专栏栏目提供文章与程序复现思路,具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…

【Seata】分布式事务解决方案——理论

目录 回顾什么是事务数据库事务的四大特性:ACID 分布式事务解释面临挑战分布式事务产生场景1. 单体架构中多数据源场景2. 分布式架构场景 分布式事务解决方案jta AtomikosLCN模式问题 Alibaba的Seata解决分布式事务问题 使用MQ解决分布式事务问题问题1:…

Thymeleaf 全局变量

在Spring Boot中,我们可以使用ThymeleafViewResolver的addStaticVariable方法来添加全局变量,这些全局变量可以在所有的Thymeleaf模板中直接使用,而不需要在每个视图控制器中重复定义。 以下是一个简单的例子,展示如何在Spring B…

【Java】已解决Java中的com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException异常

文章目录 一、分析问题背景二、可能出错的原因三、错误代码示例四、正确代码示例五、注意事项 已解决Java中的com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException异常 在Java中操作MySQL数据库时,我们经常会使用JDBC(Java Database Connectivi…

wordpress商用付费主题与免费主题的区别

WordPress免费主题与WordPress付费主题,都可以用,但存在非常大的差别。从直观的感受,简单地说就是,WordPress免费主题能用,WordPress付费主题好用。如果涉及到其它的方面,WordPress商用付费主题与免费主题之…

js中!emailPattern.test(email) 的test是什么意思

test 是 JavaScript 正则表达式(RegExp)对象的方法之一,用于测试一个字符串是否与正则表达式匹配。正则表达式是一种用于匹配字符串的模式,通常用于验证输入数据、查找和替换文本等。 使用 test 方法 test 方法语法如下&#xf…

Microsoft Remote Desktop:随时随地,掌控你的桌面

Microsoft Remote Desktop是一款卓越的远程桌面连接工具,由微软公司精心打造,旨在为用户提供高效、安全且便捷的远程办公体验。 Microsoft Remote Desktop mac版获取 这款软件支持跨平台操作,无论是在Windows、macOS还是iOS等设备上&#xf…

Idea连接GitLab的过程以及创建在gitlab中创建用户和群组

上期讲述了如何部署GitLab以及修复bug,这期我们讲述,如何连接idea。 首先安装gitlab插件 下载安装idea上并重启 配置ssh免密登录 使用管理员打开命令行输入:ssh-keygen -t rsa -C xxxaaa.com 到用户目录下.ssh查看id_rsa.pub文件 打开复制…

华为OD刷题C卷 - 每日刷题36(剩余银饰的重量,最大坐标值、小明的幸运数)

1、(剩余银饰的重量): 这段代码是解决“剩余银饰的重量”的问题。它提供了一个Java类Main,其中包含main方法和getResult方法,用于计算经过一系列熔化过程后剩余银饰的重量。 main方法首先读取银饰的个数n&#xff0c…

三分钟了解链动3+1模式

在电商领域的营销策略中,链动31模式以其独特的魅力和优势,吸引了众多商家的目光。下面,我们将对这一模式进行深度剖析,并探讨其相较于链动21模式的优势所在。 一、身份设置与奖励机制 链动31模式在身份设置上分为三种&#xff1…

漏洞挖掘 | 记一次某src拿下高危漏洞

一、获取web端管理员权限 0x01简单查看一下,发现存在登录以及证书查询操作指南等功能 因该站特征较为明显,所以对页面进行了强打码 0x02弱口令测试(无成果) 既然存在登录口,那么肯定要试试弱口令了,开干…

解锁微信客服的潜力:提升客户满意度与忠诚度

随着全球数字化进程的加速,企业如何有效利用数字化工具提升服务质量和客户满意度,成为了企业国际化、数字化出海的关键。在这一大背景下,微信客服以其卓越的功能和广泛的用户基础,成为了企业数字化转型的重要助力。 一、微信客服…

从零开始理解 XML 和 JSON 的区别

在这篇文章中,我们将深入探讨XML和JSON这两种数据格式的关键异同点,以便读者可以根据项目需求做出明智的技术选择。 了解XML XML(Extensible Markup Language)是一种用于数据定义的标记语言,最初由万维网联盟&#x…

深入理解网络传输协议——UDP协议优化

UDP 是一个简单常用的协议,经常用于引导其他传输协议。事实上,UDP 的特色在于它所省略的那些功能:连接状态、握手、重发、重组、重排、拥塞控制、拥塞预防、流量控制,甚至可选的错误检测,统统没有。这个面向消息的最简…