- 学习:知识的初次邂逅
- 复习:知识的温故知新
- 练习:知识的实践应用
目录
一,原题力扣链接
二,题干
员工表:
Employees
+---------------+---------+ | Column Name | Type | +---------------+---------+ | employee_id | int | | employee_name | varchar | | manager_id | int | +---------------+---------+ employee_id 是这个表具有唯一值的列。 这个表中每一行中,employee_id 表示职工的 ID,employee_name 表示职工的名字,manager_id 表示该职工汇报工作的直线经理。 这个公司 CEO 是 employee_id = 1 的人。编写解决方案,找出所有直接或间接向公司 CEO 汇报工作的职工的
employee_id
。由于公司规模较小,经理之间的间接关系 不超过 3 个经理 。
可以以 任何顺序 返回无重复项的结果。
返回结果示例如下。
示例 1:
输入:Employees
table: +-------------+---------------+------------+ | employee_id | employee_name | manager_id | +-------------+---------------+------------+ | 1 | Boss | 1 | | 3 | Alice | 3 | | 2 | Bob | 1 | | 4 | Daniel | 2 | | 7 | Luis | 4 | | 8 | Jhon | 3 | | 9 | Angela | 8 | | 77 | Robert | 1 | +-------------+---------------+------------+ 输出: +-------------+ | employee_id | +-------------+ | 2 | | 77 | | 4 | | 7 | +-------------+ 解释: 公司 CEO 的 employee_id 是 1. employee_id 是 2 和 77 的职员直接汇报给公司 CEO。 employee_id 是 4 的职员间接汇报给公司 CEO 4 --> 2 --> 1 。 employee_id 是 7 的职员间接汇报给公司 CEO 7 --> 4 --> 2 --> 1 。 employee_id 是 3, 8 ,9 的职员不会直接或间接的汇报给公司 CEO。
三,建表语句
import pandas as pd
data = [[1, 'Boss', 1], [3, 'Alice', 3], [2, 'Bob', 1], [4, 'Daniel', 2], [7, 'Luis', 4], [8, 'John', 3], [9, 'Angela', 8], [77, 'Robert', 1]]
employees = pd.DataFrame(data, columns=['employee_id', 'employee_name', 'manager_id']).astype({'employee_id':'Int64', 'employee_name':'object', 'manager_id':'Int64'})
employees
四,分析
题解:
表:员工表
字段:员工id,员工姓名,经理id
找出所有直接或间接向公司 CEO 汇报工作的职工的
employee_id
。
第一步:拉平一次,经理id=员工id 拿到上级的姓名 和上级的id
df = pd.merge(employees,employees,how='inner',left_on='manager_id',right_on='employee_id')
df
第二步:拉平二次,经理id=员工id 拿到上上级的姓名和id
df = pd.merge(employees,employees,how='inner',left_on='manager_id',right_on='employee_id')
df1 = pd.merge(df,employees,how='inner',left_on='manager_id_y',right_on='employee_id')
df1
第三步:过滤 找到经理的三三级是1 且自己不是1的员工id
最后一步,输出最终结果
五,Pandas解答
import pandas as pd
def find_reporting_people(employees: pd.DataFrame) -> pd.DataFrame:
df = pd.merge(employees,employees,how='inner',left_on='manager_id',right_on='employee_id')
df1 = pd.merge(df,employees,how='inner',left_on='manager_id_y',right_on='employee_id')
df2 = df1[df1['manager_id'] ==1]
df3 = df2[df2['employee_id_x'] !=1]
df4 = df3['employee_id_x'].to_frame()
df4.rename(columns={'employee_id_x':'employee_id'},inplace=True)
return df4
六,验证
七,知识点总结
- Pandas内连接的运用 API:merge
- Pandas 过滤的运用
- Pandas 中series转datafarme的运用
- Pandas中改名的运用 API:rename
- python函数的综合运用
- 经典题目 三级拉平表
- 学习:知识的初次邂逅
- 复习:知识的温故知新
- 练习:知识的实践应用