pandas笔记(五)-- 部门工资最高的员工(数据表的合并与分组)
题目描述
输入
employee
表和department
表,查询部门工资最高的员工,按任意顺序返回结果表
测试用例
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 |
输出:
Employee | Salary | Department |
---|---|---|
Jim | 90000 | IT |
Max | 90000 | IT |
Henry | 80000 | Sales |
解析
问题的核心是需要将员工表中的departmentId
与部门表中id
键相关联,需要用到pandas中的merge
函数
关于merge函数的具体定义,可以看这篇博文 https://www.cnblogs.com/guxh/p/9451532.html
思路
使用
merge
函数合并两张数据表,再根据部门进行分组和筛选即可得到员工数据,这里同样需要注意列的重命名问题
此外,在寻找最大工资时需要使用transform("max")
而不是max
,这是因为transform
返回的是一个与原数据
表长度相同的Series,如果使用max
函数将导致后续逻辑索引抛出ValueError
代码
import pandas as pd
def department_highest_salary(employee: pd.DataFrame, department: pd.DataFrame) -> pd.DataFrame:
df = employee.merge(department, left_on = "departmentId", right_on = "id")
# merge函数将自动为同名的列添加下标_x和_y来加以区分,需重命名
df.rename(columns = {"name_x": "Employee", "name_y": "Department", "salary": "Salary"}, inplace = True)
max_salary = df.groupby("Department")["Salary"].transform("max")
return df[df["Salary"]==max_salary][["Employee", "Salary", "Department"]]