[코딩테스트]/[Pandas]

[LeetCode - Pandas] (Easy) 1978. Employees Whose Manager Left the Company

잰잰' 2025. 4. 4. 17:31

 

Table: Employees

+-------------+----------+
| Column Name | Type     |
+-------------+----------+
| employee_id | int      |
| name        | varchar  |
| manager_id  | int      |
| salary      | int      |
+-------------+----------+

SQL에서 employee_id는 이 테이블의 기본 키입니다. 이 테이블은 직원들에 대한 정보, 급여 및 관리자 ID를 포함하고 있습니다. 일부 직원들은 관리자가 없어서 (manager_id가 null입니다).

 

급여가 30,000달러 미만이고 관리자가 회사를 떠난 직원들의 ID를 찾으세요. 관리자가 회사를 떠나면 해당 관리자의 정보는 Employees 테이블에서 삭제되지만, 보고서에는 여전히 해당 직원의 manager_id가 떠난 관리자의 ID로 설정되어 있습니다.

결과 테이블은 employee_id 순으로 정렬하여 반환하세요.

 

Example 1:

Input:  
Employees table:
+-------------+-----------+------------+--------+
| employee_id | name      | manager_id | salary |
+-------------+-----------+------------+--------+
| 3           | Mila      | 9          | 60301  |
| 12          | Antonella | null       | 31000  |
| 13          | Emery     | null       | 67084  |
| 1           | Kalel     | 11         | 21241  |
| 9           | Mikaela   | null       | 50937  |
| 11          | Joziah    | 6          | 28485  |
+-------------+-----------+------------+--------+
Output: 
+-------------+
| employee_id |
+-------------+
| 11          |
+-------------+

설명: 급여가 30,000달러 미만인 직원은 1번 (Kalel)과 11번 (Joziah)입니다. Kalel의 관리자는 11번 직원으로, 현재 회사에 재직 중인 Joziah입니다. Joziah의 관리자는 6번 직원인데, 이 직원은 회사에서 떠났기 때문에 해당 직원에 대한 정보가 삭제되어 데이터베이스에 존재하지 않습니다.

 

✏️ 풀이

import pandas as pd

def find_employees(employees: pd.DataFrame) -> pd.DataFrame:
    df = employees[(employees['salary'] < 30000) & (~employees['manager_id'].isna())]

    df_merge = pd.merge(df, employees, how='left', left_on='manager_id', right_on='employee_id')

    return df_merge[df_merge['manager_id_y'].isna()][['employee_id_x']].rename(columns={'employee_id_x':'employee_id'})

 

📚 개념정리

merge() ? 두 객체를 병합하는 메서드 (join과 비슷하나 더 세부적 설정이 가능)

df.merge(how='inner', on=None, left_on=None, right_on=None, sort=False, suffixes=('_x', '_y'))

how : 병합시 기준이 될 인덱스 (left / right / inner / outer / cross)

on : 열 기준 병합 시 기준으로 할 열의 이름

left_on, right_on : 열 기준 병합 시 양쪽 열 이름이 다르다면 각각 어떤 열을 기준으로 할지 설정

sort : 병합 후 인덱스 정렬 여부

suffixes : 병합할 객체들 간 이름이 중복되는 열이 있다면 뒤에 붙일 접미사를 정함