- 学习:知识的初次邂逅
- 复习:知识的温故知新
- 练习:知识的实践应用
目录
一,原题力扣链接
二,题干
表:
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
data = [[1, 'Joe', 70000, 1], [2, 'Jim', 90000, 1], [3, 'Henry', 80000, 2], [4, 'Sam', 60000, 2], [5, 'Max', 90000, 1]]
employee = pd.DataFrame(data, columns=['id', 'name', 'salary', 'departmentId']).astype({'id':'Int64', 'name':'object', 'salary':'Int64', 'departmentId':'Int64'})
data = [[1, 'IT'], [2, 'Sales']]
department = pd.DataFrame(data, columns=['id', 'name']).astype({'id':'Int64', 'name':'object'})
四,分析
第一步:合并两个表: 采用内连接
df = pd.merge(employee,department,left_on='departmentId',right_on='id') #内连接2个表
第二步,使用rank api 然后 设置参数 取并列第一
df['rn'] = df.groupby('name_y')['salary'].rank(method='min', ascending=False) #允许并列 添加这个参数即可
第三步,过滤 取rn=1的行 然后选择合适的列 并改名即可
五,Pandas解答
import pandas as pd
def department_highest_salary(employee: pd.DataFrame, department: pd.DataFrame) -> pd.DataFrame:
df = pd.merge(employee,department,left_on='departmentId',right_on='id') #内连接2个表
df['rn'] = df.groupby('name_y')['salary'].rank(method='min', ascending=False) #允许并列 添加这个参数即可
df1 = df[df['rn']==1][['name_y','name_x','salary']]
df1.columns = ['Department', 'Employee', 'Salary']
return df1
六,验证
七,知识点总结
- Pandas内连接合并两个表的运用 API:marge
- Pandas多表连接的时候指定连接的列的运用 API:left_on和right_on
- Pandas分组的运用 API:groupby
- Pandas分组取第一的运用(类似sql中的开窗 rank 允许并列)rank(ascending)
- Pandas的综合练习
- 学习:知识的初次邂逅
- 复习:知识的温故知新
- 练习:知识的实践应用