[코딩테스트]/[Pandas]

[LeetCode - Pandas] (Easy) 1731. The Number of Employees Which Report to Each Employee

잰잰' 2025. 4. 10. 00:25
Table: Employees

+-------------+----------+
| Column Name | Type     |
+-------------+----------+
| employee_id | int      |
| name        | varchar  |
| reports_to  | int      |
| age         | int      |
+-------------+----------+

employee_id는 이 테이블에서 고유한 값을 가진 열입니다. 이 테이블은 직원들의 정보와 그들이 보고하는 관리자 ID를 포함하고 있습니다. 일부 직원은 누구에게도 보고하지 않으며 (즉, reports_to가 null인 경우) 보고하지 않습니다.

 

문제

이 문제에서는 관리자를 "적어도 한 명 이상의 직원에게 보고받는 직원"으로 정의합니다.

모든 관리자들의 ID, 이름, 그들에게 직접 보고하는 직원 수, 그리고 보고하는 직원들의 평균 나이를 가장 가까운 정수로 반올림하여 보고하는 솔루션을 작성하세요.

결과 테이블은 employee_id로 정렬되어야 합니다.

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

Example 1:

Input: 
Employees table:
+-------------+---------+------------+-----+
| employee_id | name    | reports_to | age |
+-------------+---------+------------+-----+
| 9           | Hercy   | null       | 43  |
| 6           | Alice   | 9          | 41  |
| 4           | Bob     | 9          | 36  |
| 2           | Winston | null       | 37  |
+-------------+---------+------------+-----+
Output: 
+-------------+-------+---------------+-------------+
| employee_id | name  | reports_count | average_age |
+-------------+-------+---------------+-------------+
| 9           | Hercy | 2             | 39          |
+-------------+-------+---------------+-------------+

설명 : Hercy는 두 명의 직원, Alice와 Bob에게 직접 보고를 받습니다. 그들의 평균 나이는 (41 + 36) / 2 = 38.5로, 이를 가장 가까운 정수로 반올림하면 39가 됩니다.

Example 2:

Input: 
Employees table:
+-------------+---------+------------+-----+ 
| employee_id | name    | reports_to | age |
|-------------|---------|------------|-----|
| 1           | Michael | null       | 45  |
| 2           | Alice   | 1          | 38  |
| 3           | Bob     | 1          | 42  |
| 4           | Charlie | 2          | 34  |
| 5           | David   | 2          | 40  |
| 6           | Eve     | 3          | 37  |
| 7           | Frank   | null       | 50  |
| 8           | Grace   | null       | 48  |
+-------------+---------+------------+-----+ 
Output: 
+-------------+---------+---------------+-------------+
| employee_id | name    | reports_count | average_age |
| ----------- | ------- | ------------- | ----------- |
| 1           | Michael | 2             | 40          |
| 2           | Alice   | 2             | 37          |
| 3           | Bob     | 1             | 37          |
+-------------+---------+---------------+-------------+

 

✏️ 풀이

import pandas as pd

def count_employees(employees: pd.DataFrame) -> pd.DataFrame:
    result = employees.groupby(['reports_to'], as_index=False).agg(reports_count=('employee_id', 'count'), average_age=('age', lambda x:int(x.mean() + 0.5)))
    result = pd.merge(employees, result, how='inner', left_on='employee_id', right_on='reports_to')

    return result[['employee_id', 'name', 'reports_count', 'average_age']]

 

📚 개념정리

groupby() 옵션 as_index=False ? 그룹 연산의 결과를 인덱스가 아닌 정규 열로 반환하라는 의미

groupby를 하면서 agg를 사용하니 groupby에 사용되는 기준 열이 결과값으로 반환되지 않았다

as_index=False 옵션을 주면 해결 가능하다

 

agg() ? 여러개의 함수를 동시에 적용 할 수 있음

반올림을 할 round()를 사용하면 원하는 값을 못 얻을 수 있다

기본적으로 반올림을 하긴 하지만, 숫자가 .5인 경우 가장 가까운 짝수로 반올림 하는 규칙때문에

int(x.mean() + 0.5) 와 같은 형식으로 사용하여 반올림 해줘야 한다