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) 와 같은 형식으로 사용하여 반올림 해줘야 한다
'[코딩테스트] > [Pandas]' 카테고리의 다른 글
[LeetCode - Pandas] (Easy) 1693. Daily Leads and Partners (0) | 2025.04.10 |
---|---|
[LeetCode - Pandas] (Easy) 1729. Find Followers Count (0) | 2025.04.10 |
[LeetCode - Pandas] (Easy) 1741. Find Total Time Spent by Each Employee (2) | 2025.04.09 |
[LeetCode - Pandas] (Easy) 1757. Recyclable and Low Fat Products (0) | 2025.04.09 |
[LeetCode - Pandas] (Easy) 1789. Primary Department for Each Employee (0) | 2025.04.07 |