每日一题26:数据操作之部门工资最高的员工

一、每日一题 

表: Employee

+--------------+---------+
| 列名          | 类型    |
+--------------+---------+
| id           | int     |
| name         | varchar |
| salary       | int     |
| departmentId | int     |
+--------------+---------+
在 SQL 中,id是此表的主键。
departmentId 是 Department 表中 id 的外键(在 Pandas 中称为 join key)。
此表的每一行都表示员工的 id、姓名和工资。它还包含他们所在部门的 id。

表: Department

+-------------+---------+
| 列名         | 类型    |
+-------------+---------+
| id          | int     |
| name        | varchar |
+-------------+---------+
在 SQL 中,id 是此表的主键列。
此表的每一行都表示一个部门的 id 及其名称。

查找出每个部门中薪资最高的员工。
按 任意顺序 返回结果表。
查询结果格式如下例所示。

示例 1:

输入:
Employee 表:
+----+-------+--------+--------------+
| id | name  | salary | departmentId |
+----+-------+--------+--------------+
| 1  | Joe   | 70000  | 1            |
| 2  | Jim   | 90000  | 1            |
| 3  | Henry | 80000  | 2            |
| 4  | Sam   | 60000  | 2            |
| 5  | Max   | 90000  | 1            |
+----+-------+--------+--------------+
Department 表:
+----+-------+
| id | name  |
+----+-------+
| 1  | IT    |
| 2  | Sales |
+----+-------+
输出:
+------------+----------+--------+
| Department | Employee | Salary |
+------------+----------+--------+
| IT         | Jim      | 90000  |
| Sales      | Henry    | 80000  |
| IT         | Max      | 90000  |
+------------+----------+--------+
解释:Max 和 Jim 在 IT 部门的工资都是最高的,Henry 在销售部的工资最高。

解答:

import pandas as pd


def department_highest_salary(employee: pd.DataFrame, department: pd.DataFrame) -> pd.DataFrame:
    #获取每个部门的最高薪资
    max_salary_per_department = employee.groupby('departmentId')['salary'].max().reset_index()
    max_salary_per_department.rename(columns = {'salary': 'max_salary'}, inplace = True)

    # 将最高薪资与员工表合并,得到每个部门中薪资最高的员工
    merged_df = pd.merge(employee, max_salary_per_department, how='inner',
                         left_on=['departmentId', 'salary'],
                         right_on=['departmentId', 'max_salary'])

    # 将结果与部门表合并以获取部门名称
    final_result = pd.merge(merged_df, department, how = 'inner', left_on = 'departmentId', right_on = 'id')
    # 选择需要的列并重命名
    final_result = final_result[['name_y', 'name_x', 'salary']]

    final_result.columns = ['Department', 'Employee', 'Salary']

    return final_result


# 显示数据
employee_data = {
    'id':[1, 2, 3, 4, 5],
    'name':['Joe', 'Jim', 'Henry', 'Sam', 'Max'],
    'salary':[70000, 90000, 80000, 60000, 90000],
    'departmentId':[1, 1, 2, 2, 1]
}

department_data = {
    'id':[1, 2],
    'name':['IT', 'Sales']
}

# 创建 DataFrame
employee_df = pd.DataFrame(employee_data)
department_df = pd.DataFrame(department_data)

# 获取每个部门中薪资最高的员工
result = department_highest_salary(employee_df, department_df)
print(result)

题源:Leetcode

二、总结

这题考察pd.merge和pd.groupby的使用,后续会出一篇关于它们的用法。

2024.5.29

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值