Pandas & NumPy Academy · 강의

단일 키와 여러 키를 사용한 GroupBy

groupby()로 하나 이상의 열을 기준으로 그룹화하고 합계, 평균, 개수, 최솟값·최댓값 집계를 적용합니다.

레슨 2/413개 단계

단일 키와 여러 키를 사용한 GroupBy은(는) CoddyKit의 무료 Pandas & NumPy Academy 강의입니다. 이것은 4개 중 2번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Pandas & NumPy Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Pandas & NumPy Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

단일 키를 사용하는 GroupBy

가장 간단한 GroupBy 호출은 하나의 열을 그룹화 키로 사용합니다. df.groupby('column_name')을 호출한 뒤 집계 함수를 연결하면 됩니다. 판다스는 해당 열의 각 고유 값마다 하나의 그룹을 만들고, 모든 숫자 열 또는 선택한 열에 집계를 적용합니다. 이는 일상적인 분석에서 가장 흔히 사용하는 GroupBy 형태입니다.

import pandas as pd

df = pd.DataFrame({
    'dept': ['Eng', 'HR', 'Eng', 'HR', 'Eng'],
    'salary': [90000, 60000, 95000, 62000, 88000],
    'years': [3, 5, 7, 2, 4]
})

print(df.groupby('dept')['salary'].mean())
# dept
# Eng    91000.0
# HR     61000.0

집계할 열 선택하기

groupby()를 호출한 후 대괄호 표기법으로 열 하나를 선택하면 SeriesGroupBy를 얻고, 목록으로 여러 열을 선택하면 DataFrameGroupBy를 얻습니다. 선택을 완전히 생략하면 판다스가 모든 숫자 열을 집계합니다. 이는 편리하지만, 관련 없는 숫자 열이 있을 때 예상하지 못한 결과를 만들 수 있습니다.

# Single column result -> SeriesGroupBy
print(df.groupby('dept')['salary'].sum())

# Multiple columns result -> DataFrameGroupBy
print(df.groupby('dept')[['salary', 'years']].mean())
#        salary  years
# dept
# Eng   91000.0    4.667
# HR    61000.0    3.500

모든 일반 집계 함수

판다스는 GroupBy 객체에서 사용할 수 있는 다양한 내장 집계 메서드를 지원합니다. 여기에는 sum(), mean(), median(), min(), max(), count(), std(), var(), first(), last()가 포함됩니다. 각 메서드는 그룹마다 하나의 스칼라를 반환하므로, 그룹화 키를 인덱스로 하는 깔끔한 요약표를 얻을 수 있습니다.

g = df.groupby('dept')['salary']
print('sum:   ', g.sum())
print('mean:  ', g.mean())
print('min:   ', g.min())
print('max:   ', g.max())
print('count: ', g.count())
print('std:   ', g.std().round(2))

여러 키를 사용하는 GroupBy

한 번에 둘 이상의 기준으로 그룹화하려면 groupby()에 열 이름 목록을 전달하십시오. 해당 열에서 값의 각 고유한 조합이 하나의 그룹이 됩니다. 결과에는 그룹화 열마다 하나의 수준이 있는 MultiIndex가 생성되므로, 여러 차원을 교차한 요약을 한 번에 세부적으로 확인할 수 있습니다.

df2 = pd.DataFrame({
    'dept':   ['Eng', 'Eng', 'HR',  'HR',  'Eng', 'HR'],
    'level':  ['L1',  'L2',  'L1',  'L2',  'L1',  'L1'],
    'salary': [80000, 100000, 55000, 70000, 82000, 58000]
})

result = df2.groupby(['dept', 'level'])['salary'].mean()
print(result)
# dept  level
# Eng   L1       81000.0
#       L2      100000.0
# HR    L1       56500.0
#       L2       70000.0

MultiIndex 결과에 접근하기

여러 키를 기준으로 그룹화하면 결과 인덱스는 MultiIndex가 됩니다. .loc['value']로 특정 외부 수준에 접근하고, 튜플로 내부 수준을 탐색할 수 있습니다. reset_index()를 호출하면 MultiIndex가 일반 열로 평탄화되므로, 이후 작업이나 내보내기에 더 편리한 경우가 많습니다.

result = df2.groupby(['dept', 'level'])['salary'].mean()

# Access Engineering rows only
print(result.loc['Eng'])
# level
# L1     81000.0
# L2    100000.0

# Flatten to a regular DataFrame
print(result.reset_index())
#   dept level    salary
# 0  Eng    L1   81000.0
# 1  Eng    L2  100000.0

as_index=False 사용하기

기본적으로 그룹화 열은 결과의 인덱스가 됩니다. as_index=False를 전달하면 그룹화 열이 일반 열로 유지되어, 이후 판다스 작업에 전달하거나 내보내기 쉬운 평평한 DataFrame을 얻을 수 있습니다. 이는 결과에 reset_index()를 호출하는 것과 같습니다.

flat = df2.groupby(['dept', 'level'], as_index=False)['salary'].mean()
print(flat)
#   dept level    salary
# 0  Eng    L1   81000.0
# 1  Eng    L2  100000.0
# 2   HR    L1   56500.0
# 3   HR    L2   70000.0

그룹별 행 개수 세기

count()는 각 그룹에서 널이 아닌 값의 개수를 반환합니다. 널 값과 관계없이 그룹별 전체 행 개수를 구하려면 size()를 사용하십시오. 데이터에 누락된 값이 있을 때 이 차이가 중요합니다. count()는 NaN 항목이 있는 그룹의 개수를 실제보다 적게 계산하기 때문입니다.

import numpy as np

df3 = pd.DataFrame({
    'dept': ['Eng', 'Eng', 'HR', 'HR'],
    'bonus': [5000, np.nan, 3000, 4000]
})

print(df3.groupby('dept')['bonus'].count())  # ignores NaN
# dept
# Eng    1
# HR     2

print(df3.groupby('dept')['bonus'].size())   # includes NaN rows
# dept
# Eng    2
# HR     2

GroupBy 결과 정렬하기

기본적으로 GroupBy는 그룹 키를 기준으로 결과를 정렬합니다. sort=False를 사용하면 정렬을 비활성화하고 처음 나타난 순서를 유지할 수 있으며, 큰 데이터셋에서는 조금 더 빠르게 처리됩니다. 결과를 DataFrame으로 얻은 후에는 모든 열에 대해 sort_values()를 사용하여 추가로 정렬할 수 있습니다.

result = (df.groupby('dept', sort=False)['salary']
            .mean()
            .reset_index()
            .sort_values('salary', ascending=False))
print(result)
#   dept    salary
# 0  Eng   91000.0
# 1   HR   61000.0

GroupBy와 다른 메서드 연결하기

GroupBy 결과는 일반적인 Series 또는 DataFrame이므로 즉시 다른 판다스 메서드를 연결할 수 있습니다. 일반적인 패턴은 집계한 다음 reset_index()를 호출하고, 열 이름을 바꾼 후, sort_values()로 정렬하는 것입니다. 중간 변수를 저장하지 않고도 이 모든 작업을 읽기 쉬운 하나의 메서드 연결로 작성할 수 있습니다.

summary = (
    df
    .groupby('dept')['salary']
    .agg(['mean', 'count'])
    .rename(columns={'mean': 'avg_salary', 'count': 'headcount'})
    .reset_index()
    .sort_values('avg_salary', ascending=False)
)
print(summary)

sum, mean, count 함께 적용하기

그룹마다 둘 이상의 통계가 필요한 경우가 많습니다. .agg()에 함수 이름 목록을 전달하면 여러 통계를 한 번에 계산할 수 있습니다. 결과는 함수마다 하나의 열이 있는 DataFrame입니다. 판다스가 데이터를 한 번만 순회하면서 모든 집계를 처리하므로, 각 집계를 따로 호출하는 것보다 효율적입니다.

result = df.groupby('dept')['salary'].agg(['sum', 'mean', 'count', 'max'])
print(result)
#           sum      mean  count    max
# dept
# Eng    273000   91000.0      3  95000
# HR     122000   61000.0      2  62000

범주형 열을 기준으로 그룹화하기

그룹화 열의 자료형이 Categorical이면 판다스는 기본적으로 행이 없는 범주까지 결과에 모두 포함합니다. 이렇게 하면 요약표에 항상 모든 범주가 표시되도록 할 수 있지만, 빈 그룹에 대해 NaN 또는 0이 있는 행이 생성됩니다. observed 매개변수로 이를 제어할 수 있으며, 빈 범주를 제외하려면 True로 설정하십시오.

df['dept'] = df['dept'].astype('category')
# With observed=True, only groups that appear in data are included
print(df.groupby('dept', observed=True)['salary'].mean())
# dept
# Eng    91000.0
# HR     61000.0

빠른 확인

이 단원에서 배운 단일 키 및 여러 키를 사용하는 GroupBy에 대한 이해도를 확인해 보십시오.

단원 요약

이 단원에서는 단일 열을 기준으로 그룹화하고 일반적인 집계를 적용하는 방법, 여러 열을 기준으로 그룹화하여 여러 차원을 교차한 요약을 만드는 방법, 그리고 널 값이 있을 때 count()와 size()의 차이를 배웠습니다. 다음으로는 한 번의 호출로 여러 통계를 계산할 수 있는 강력한 agg() 메서드를 살펴봅니다.

무료로 시작

AI 튜터와 함께 Python을(를) 배우세요 — 무료

브라우저에서 실제 코드를 작성하고 실행하며, 24/7 AI 튜터로부터 즉각적인 도움을 받고, 웹이나 앱에서 중단한 부분부터 계속 학습하세요.

코스
30
레슨
120

자주 묻는 질문

“단일 키와 여러 키를 사용한 GroupBy” 강의는 무료인가요?

네 — “단일 키와 여러 키를 사용한 GroupBy” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Pandas & NumPy Academy 강의 전체를 잠금 해제할 수 있습니다. Pandas & NumPy Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

“단일 키와 여러 키를 사용한 GroupBy”에서 뭘 배우나요?

groupby()로 하나 이상의 열을 기준으로 그룹화하고 합계, 평균, 개수, 최솟값·최댓값 집계를 적용합니다. 브라우저에서 직접 실행하는 실습 코드로 Pandas & NumPy Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

Pandas & NumPy Academy을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 Pandas & NumPy Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 2번째 강의입니다.

“단일 키와 여러 키를 사용한 GroupBy” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 Pandas & NumPy Academy 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 Pandas & NumPy Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. 분할-적용-결합 패턴
  2. 단일 키와 여러 키를 사용한 GroupBy
  3. agg() 메서드
  4. GroupBy 변환과 필터링
← Pandas & NumPy Academy(으)로 돌아가기