[코딩테스트]/[Pandas]

[LeetCode - Pandas] (Easy) 577. Employee Bonus

잰잰' 2025. 5. 2. 18:22
Table: Employee

+-------------+---------+
| Column Name | Type    |
+-------------+---------+
| empId       | int     |
| name        | varchar |
| supervisor  | int     |
| salary      | int     |
+-------------+---------+

empId는 이 테이블의 고유 값이 있는 열입니다. 이 테이블의 각 행은 직원의 이름과 ID, 급여, 그리고 관리자 ID를 나타냅니다.

Table: Bonus

+-------------+------+
| Column Name | Type |
+-------------+------+
| empId       | int  |
| bonus       | int  |
+-------------+------+

empId는 이 테이블의 고유 값이 있는 열입니다.
empId는 Employee 테이블의 empId를 참조하는 외래 키(참조 열)입니다.
이 테이블의 각 행은 직원의 ID와 해당 직원의 보너스를 포함합니다.

 

문제

각 직원의 보너스가 1000 미만인 직원의 이름과 보너스 금액을 보고하는 솔루션을 작성하세요.

결과 테이블은 아무 순서로 반환할 수 있습니다.

결과 형식은 아래 예시와 같습니다.

Example 1:

Input: 
Employee table:
+-------+--------+------------+--------+
| empId | name   | supervisor | salary |
+-------+--------+------------+--------+
| 3     | Brad   | null       | 4000   |
| 1     | John   | 3          | 1000   |
| 2     | Dan    | 3          | 2000   |
| 4     | Thomas | 3          | 4000   |
+-------+--------+------------+--------+
Bonus table:
+-------+-------+
| empId | bonus |
+-------+-------+
| 2     | 500   |
| 4     | 2000  |
+-------+-------+
Output: 
+------+-------+
| name | bonus |
+------+-------+
| Brad | null  |
| John | null  |
| Dan  | 500   |
+------+-------+

 

✏️ 풀이

import pandas as pd

def employee_bonus(employee: pd.DataFrame, bonus: pd.DataFrame) -> pd.DataFrame:
    df = pd.merge(employee, bonus, how='left', on='empId')

    return df[(df['bonus'] < 1000) | (df['bonus'].isna())][['name', 'bonus']]

1. employee, bonus 두 데이터프레임 merge

2. 보너스가 1000미만 이거나 없는(null) 직원 조회