力扣:185. 部门工资前三高的所有员工(Python3)
题目:
表:
Employee
+--------------+---------+ | Column Name | Type | +--------------+---------+ | id | int | | name | varchar | | salary | int | | departmentId | int | +--------------+---------+ id 是该表的主键列(具有唯一值的列)。 departmentId 是 Department 表中 ID 的外键(reference 列)。 该表的每一行都表示员工的ID、姓名和工资。它还包含了他们部门的ID。表:
Department
+-------------+---------+ | Column Name | Type | +-------------+---------+ | id | int | | name | varchar | +-------------+---------+ id 是该表的主键列(具有唯一值的列)。 该表的每一行表示部门ID和部门名。公司的主管们感兴趣的是公司每个部门中谁赚的钱最多。一个部门的 高收入者 是指一个员工的工资在该部门的 不同 工资中 排名前三 。
编写解决方案,找出每个部门中 收入高的员工 。
以 任意顺序 返回结果表。
返回结果格式如下所示。
来源:力扣(LeetCode)
链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
示例:
示例 1:
输入:
Employee 表: +----+-------+--------+--------------+ | id | name | salary | departmentId | +----+-------+--------+--------------+ | 1 | Joe | 85000 | 1 | | 2 | Henry | 80000 | 2 | | 3 | Sam | 60000 | 2 | | 4 | Max | 90000 | 1 | | 5 | Janet | 69000 | 1 | | 6 | Randy | 85000 | 1 | | 7 | Will | 70000 | 1 | +----+-------+--------+--------------+ Department 表: +----+-------+ | id | name | +----+-------+ | 1 | IT | | 2 | Sales | +----+-------+
输出:+------------+----------+--------+ | Department | Employee | Salary | +------------+----------+--------+ | IT | Max | 90000 | | IT | Joe | 85000 | | IT | Randy | 85000 | | IT | Will | 70000 | | Sales | Henry | 80000 | | Sales | Sam | 60000 | +------------+----------+--------+
解释:在IT部门: - Max的工资最高 - 兰迪和乔都赚取第二高的独特的薪水 - 威尔的薪水是第三高的 在销售部: - 亨利的工资最高 - 山姆的薪水第二高 - 没有第三高的工资,因为只有两名员工
解法:
先把employee表左外连接department表,接着根据部门升序、工资降序排序,然后根据部门分组,添加排名列,填入每个部门的工资排名,最后返回每个部门中排名列≤3.0的行。
知识点:
1.DataFrame.loc [row selection, column selection]:按照标签或者索引、布尔值或者条件进行选择数据。row selection:行标签(索引),可以是切片、列表;column selection:列标签(名),可以是切片、列表。此外,还可以根据条件来提取数据所在的行:
data = [[1, 'Joe', 85000, 1], [2, 'Henry', 80000, 2], [3, 'Sam', 60000, 2], [4, 'Max', 90000, 1], [5, 'Janet', 69000, 1], [6, 'Randy', 85000, 1], [7, 'Will', 70000, 1]] employee = pd.DataFrame(data, columns=['id', 'name', 'salary', 'departmentId']).astype({'id': 'Int64', 'name': 'object', 'salary': 'Int64', 'departmentId': 'Int64'})employee.loc[(employee['id'] < 5) & (employee['salary'] > 5000)]
代码:
import pandas as pd def top_three_salaries(employee: pd.DataFrame, department: pd.DataFrame) -> pd.DataFrame: m = employee.merge(department, how='left', left_on='departmentId', right_on='id')[['name_y', 'name_x', 'salary']].sort_values(['name_y', 'salary'], ascending=[True, False], ignore_index=True) for d in list(department['name']): m.loc[m['name_y'] == d, 'rank'] = list(m[m['name_y'] == d]['salary'].rank(method='dense', ascending=False)) return m[m['rank'] <= 3.0][['name_y', 'name_x', 'salary']].rename(columns={'name_y': 'Department', 'name_x': 'Employee'}) if len(employee) > 0 else pd.DataFrame({'Department': [], 'Employee': [], 'Salary': []})