[문제]
https://leetcode.com/problems/managers-with-at-least-5-direct-reports/description/
[풀이]
Pandas
import pandas as pd
def find_managers(employee: pd.DataFrame) -> pd.DataFrame:
# manager = employee.groupby('managerId', as_index=False).size()
# merged = manager.merge(employee, left_on='managerId', right_on='id')
# return merged[merged['size']>=5][['name']]
managers = employee.groupby('managerId', as_index=False)\
.agg(reporting=('id', 'count'),).query('reporting >=5 ')['managerId']
return employee[employee['id'].isin(managers)][['name']]
SQL
SELECT name
FROM Employee
WHERE id IN (SELECT managerId
FROM Employee
GROUP BY managerId
HAVING COUNT(managerId) >= 5)
-- SELECT e.name
-- FROM Employee AS e
-- INNER JOIN Employee AS m ON e.id=m.managerId
-- GROUP BY m.managerId
-- HAVING COUNT(m.managerId) >= 5
agg 함수와 query 함수에 대해 알아보자.
1. agg 함수
agg 함수는 집계 함수를 적용할 때 사용함. 데이터프레임이나 그룹화된 데이터에 대해 여러 집계 함수를 한 번에 적용할 수 있는 도구임.
주요 특징
1) 하나의 열에 여러 집계 함수 적용 가능
2) 여러 열에 서로 다른 집계 함수 적용 가능
3) 그룹화된(groupby()) 데이터와 함께 사용 가능
문법
DataFrame.agg(func=None, axis=0, *args, **kwrags)
func : 집계 함수 또는 함수의 리스트/딕셔너리. 함수는 문자열이나 python 함수로 전달 가능 ('mean' or np.mean)
axis : 0 이 열기준으로 기본값, 1은 행 기준
반환값은 집계된 결과를 포함하는 DataFrame 또는 Series
1) 단일 열에 여러 함수 적용하려면 함수를 리스트 형태로 전달한다.
result = df['A'].agg(['sum', 'mean', 'max']) # 시리즈 반환
result = df[['A']].agg(['sum', 'mean', 'max']) # 데이터프레임 반환
시리즈라면 시리즈 형태로 반환하고 데이터프레임이면 데이터프레임 형태로 반환한다
2) 여러 열에 동일한 함수 적용
# 모든 열에 대해 'sum' 함수 적용
result = df.agg('sum') # 시리즈 반환 (index가 열)
result = df.agg(['sum']) # 데이터프레임 반환 (index가 함수)
result = df.agg(['sum', 'mean']) # 데이터프레임 반환 (index가 함수)
3) 여러 열에 다른 함수 적용
result = df.agg({'A': 'sum', 'B': 'mean'}) # 시리즈 반환
result = df.agg({'A': ['sum'], 'B': ['mean']}) # 데이터프레임 반환
result = df.agg({'A': ['sum', 'mean'], 'B': ['count','mean']}) # 데이터프레임 반환
{열이름 : 함수} 처럼 딕셔너리 형태로 전달하면 된다. 여러 함수를 전달하려면 딕셔너리 값에 리스트로 감싸서 전달해주면 된다.
4) 그룹화된 데이터에 사용
# group 열을 그룹화한 후 value 열에 sum과 mean 함수 적용
result = df.groupby('group').agg({'value': ['sum', 'mean']})
5) 여러 함수 적용 결과에 새로운 이름 지정
# value 열에 sum 함수를 적용한 열의 이름을 total_sum 로 한다
# value 열에 mean 함수를 적용한 열의 이름을 avg_value 로 한다
result = df.groupby('group').agg(total_sum=('value', 'sum'),
avg_value=('value', 'mean'))
2. query 함수
문자열 기반으로 데이터프레임을 필터링할 수 있는 방법을 제공함 (SQL 스타일의 조건문 사용)
문법
DataFrame.query(expr, inplace=False, **kwargs)
expr : 필터링 조건을 나타내는 문자열. SQL과 비슷한 형식으로 작성
반환값은 조건에 맞는 행만 포함하는 새로운 데이터프레임
1. 조건문으로 필터링
# A가 15보다 큰 행 필터링
filtered_df = df.query("A > 15")
2. 여러 조건 사용
# A가 15보다 크고 B가 20보다 작은 행
filtered_df = df.query("A > 15 and B < 20")
3. 문자열 조건
# 이름이 Alice인 행
filtered_df = df.query("Name == 'Alice'")
컬럼 이름에 공백이나 특수문자가 있으면 컬럼명을 백틱(`) 으로 묶어서 사용해야 함
'코딩 테스트 > Pandas' 카테고리의 다른 글
Not Boring Movies (0) | 2024.12.25 |
---|---|
Confirmation Rate (0) | 2024.12.24 |
Students and Examinations (0) | 2024.12.22 |
Employee Bonus (0) | 2024.12.22 |
Average Time of Process per Machine (0) | 2024.12.21 |