코딩 테스트/Pandas

Managers with at Least 5 Direct Reports // agg()와 query()

susinlee 2024. 12. 23. 10:58

[문제]

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