판다스 groupby 함수란?
데이터 분석을 하다 보면 특정 기준에 따라 데이터를 그룹화하고
각 그룹별로 통계를 내야 하는 경우가 많습니다.
예를 들어, 지역별 판매량을 알고 싶거나
제품 카테고리별 평균 가격을 계산하고 싶을 때가 있죠.
이럴 때 판다스(Pandas)의 groupby 함수가 큰 도움이 됩니다.
groupby 함수는 SQL의 GROUP BY 절과 유사한 기능을 하며,
데이터를 특정 열의 값에 따라 그룹화한 후 각 그룹에 대해 계산을 수행할 수 있게 해줍니다.
이를 통해 복잡한 데이터에서 의미 있는 인사이트를 쉽게 도출할 수 있습니다.
groupby 함수는 '분할(Split) → 적용(Apply) → 결합(Combine)' 패턴을 따릅니다. 데이터를 그룹으로 나누고, 각 그룹에 함수를 적용한 후, 결과를 하나로 결합하는 과정을 거칩니다.
기본적인 groupby 사용법
먼저 예제 데이터를 불러와 기본적인 groupby 사용법을 알아보겠습니다.
판다스를 사용하여 Excel 파일을 읽고 데이터프레임으로 변환하는 코드부터 시작해봅시다.
1. 데이터 불러오기
import pandas as pd
# 엑셀 파일 불러오기
df = pd.read_excel('data.xlsx')
# 데이터 확인하기
print(df)
실행 결과:
일자 지역 제품 분류 단가 판매금액 수량 구매자
0 2024-01-01 서울 노트북 전자제품 225,000 450,000 2 김철수
1 2024-01-02 부산 마우스 액세서리 15,000 75,000 5 이영희
2 2024-01-03 대구 키보드 액세서리 40,000 120,000 3 박민수
3 2024-01-04 서울 모니터 전자제품 380,000 380,000 1 최지영
4 2024-01-05 인천 헤드셋 액세서리 47,500 95,000 2 정태호
5 2024-01-06 광주 노트북 전자제품 520,000 520,000 1 김철수
6 2024-01-07 서울 마우스 액세서리 16,250 65,000 4 이영희
7 2024-01-08 부산 키보드 액세서리 70,000 140,000 2 박민수
8 2024-01-09 대구 모니터 전자제품 420,000 420,000 1 최지영
9 2024-01-10 인천 헤드셋 액세서리 28,333 85,000 3 정태호
2. 단일 열로 그룹화하기
가장 기본적인 groupby 사용법은 하나의 열을 기준으로 데이터를 그룹화하는 것입니다.
예를 들어, 지역별로 데이터를 그룹화해보겠습니다.
# 지역별로 그룹화하기
region_group = df.groupby('지역')
# 그룹별 개수 확인
print(region_group.size())
실행 결과:
지역
광주 1
대구 2
부산 2
서울 3
인천 2
dtype: int64
이 결과는 각 지역별로 몇 개의 데이터가 있는지 보여줍니다.
서울에는 3개의 데이터가 있고,
광주에는 1개의 데이터가 있음을 알 수 있습니다.
그룹별 집계 함수 활용하기
groupby 함수의 진정한 힘은 그룹화 후 각 그룹에 대해 다양한 집계 함수를 적용할 수 있다는 점입니다.
자주 사용되는 집계 함수로는 sum(), mean(), count(), max(), min() 등이 있습니다.
1. 지역별 판매금액 합계 구하기
# 지역별 판매금액 합계
region_sales_sum = df.groupby('지역')['판매금액'].sum()
print(region_sales_sum)
실행 결과:
지역
광주 520,000
대구 540,000
부산 215,000
서울 895,000
인천 180,000
Name: 판매금액, dtype: int64
2. 제품별 평균 단가 구하기
# 제품별 평균 단가
product_avg_price = df.groupby('제품')['단가'].mean()
print(product_avg_price)
실행 결과:
제품
노트북 372,500.0
마우스 15,625.0
모니터 400,000.0
키보드 55,000.0
헤드셋 37,916.5
Name: 단가, dtype: float64
3. 여러 집계 함수 한 번에 적용하기
여러 집계 함수를 동시에 적용하려면 agg() 메서드를 사용합니다.
# 제품별로 여러 통계량 한번에 계산하기
product_stats = df.groupby('제품')['판매금액'].agg(['sum', 'mean', 'count', 'max'])
print(product_stats)
실행 결과:
sum mean count max
제품
노트북 970,000 485,000 2 520,000
마우스 140,000 70,000 2 75,000
모니터 800,000 400,000 2 420,000
키보드 260,000 130,000 2 140,000
헤드셋 180,000 90,000 2 95,000
agg() 메서드를 사용하면 각 열마다 다른 집계 함수를 적용할 수도 있습니다. 예를 들어, df.groupby('지역').agg({'판매금액': 'sum', '수량': 'mean'})와 같이 사용할 수 있습니다.
여러 열을 기준으로 그룹화하기
더 세분화된 분석을 위해 여러 열을 기준으로 그룹화할 수도 있습니다.
이렇게 하면 계층적 인덱스(Hierarchical Index)가 생성됩니다.
1. 지역과 분류로 그룹화하기
# 지역과 분류별로 그룹화하여 판매금액 합계 구하기
region_category_sales = df.groupby(['지역', '분류'])['판매금액'].sum()
print(region_category_sales)
실행 결과:
지역 분류
광주 전자제품 520,000
대구 전자제품 420,000
액세서리 120,000
부산 액세서리 215,000
서울 전자제품 830,000
액세서리 65,000
인천 액세서리 180,000
Name: 판매금액, dtype: int64
2. unstack() 메서드로 테이블 형태로 변환하기
계층적 인덱스는 때로 보기 어려울 수 있습니다. 이럴 때 unstack() 메서드를 사용하면 테이블 형태로 변환할 수 있습니다.
# 지역과 분류별 판매금액을 테이블 형태로 변환
region_category_table = region_category_sales.unstack()
print(region_category_table)
실행 결과:
분류 액세서리 전자제품
지역
광주 NaN 520,000
대구 120,000 420,000
부산 215,000 NaN
서울 65,000 830,000
인천 180,000 NaN
고급 기능: 그룹 객체 다루기
groupby 함수는 GroupBy 객체를 반환합니다.
이 객체를 통해 더 복잡한 작업을 수행할 수 있습니다.
1. 그룹별로 반복 작업하기
GroupBy 객체는 이터레이터처럼 동작하여 각 그룹을 순회할 수 있습니다.
# 지역별로 순회하며 첫 번째 행 출력하기
for name, group in df.groupby('지역'):
print(f"지역: {name}")
print(group.iloc[0])
print("-" * 30)
실행 결과:
지역: 광주
일자 2024-01-06
지역 광주
제품 노트북
분류 전자제품
단가 520,000
판매금액 520,000
수량 1
구매자 김철수
Name: 5, dtype: object
------------------------------
지역: 대구
일자 2024-01-03
지역 대구
제품 키보드
분류 액세서리
단가 40,000
판매금액 120,000
수량 3
구매자 박민수
Name: 2, dtype: object
------------------------------
...
2. 사용자 정의 함수 적용하기
apply() 메서드를 사용하면 사용자 정의 함수를 각 그룹에 적용할 수 있습니다.
# 사용자 정의 함수 만들기
def get_price_range(group):
return pd.Series({
'최소단가': group['단가'].min(),
'최대단가': group['단가'].max(),
'가격차이': group['단가'].max() - group['단가'].min()
})
# 제품별로 함수 적용하기
product_price_range = df.groupby('제품').apply(get_price_range)
print(product_price_range)
실행 결과:
최소단가 최대단가 가격차이
제품
노트북 225,000 520,000 295,000
마우스 15,000 16,250 1,250
모니터 380,000 420,000 40,000
키보드 40,000 70,000 30,000
헤드셋 28,333 47,500 19,167
3. filter() 메서드로 그룹 필터링하기
filter() 메서드를 사용하면 특정 조건을 만족하는 그룹만 선택할 수 있습니다.
# 판매 건수가 2건 이상인 지역만 선택하기
filtered_regions = df.groupby('지역').filter(lambda x: len(x) >= 2)
print(filtered_regions['지역'].value_counts())
실행 결과:
지역
서울 3
대구 2
부산 2
인천 2
Name: count, dtype: int64
그룹화 데이터 시각화하기
groupby 함수로 집계한 데이터는 시각화하기 좋은 형태입니다.
matplotlib이나 seaborn 라이브러리를 사용하여 그룹화된 데이터를 시각적으로 표현할 수 있습니다.
1. 지역별 판매금액 막대 그래프
import matplotlib.pyplot as plt
# 지역별 판매금액 합계 계산
region_sales = df.groupby('지역')['판매금액'].sum()
# 막대 그래프 그리기
plt.figure(figsize=(10, 6))
region_sales.plot(kind='bar', color='skyblue')
plt.title('지역별 판매금액 합계', fontsize=14)
plt.xlabel('지역', fontsize=12)
plt.ylabel('판매금액', fontsize=12)
plt.grid(axis='y', linestyle='--', alpha=0.7)
plt.xticks(rotation=0)
plt.tight_layout()
plt.savefig('region_sales.png')
plt.show()
2. 제품별, 분류별 판매량 비교
import seaborn as sns
# 제품별, 분류별 판매량 합계 계산
product_category_qty = df.groupby(['제품', '분류'])['수량'].sum().unstack()
# 그룹화된 막대 그래프 그리기
plt.figure(figsize=(12, 7))
product_category_qty.plot(kind='bar', stacked=True)
plt.title('제품별, 분류별 판매량', fontsize=14)
plt.xlabel('제품', fontsize=12)
plt.ylabel('판매 수량', fontsize=12)
plt.legend(title='분류')
plt.grid(axis='y', linestyle='--', alpha=0.7)
plt.tight_layout()
plt.savefig('product_category_qty.png')
plt.show()
groupby로 집계된 데이터는 plot() 메서드를 직접 사용할 수 있어 시각화가 매우 간편합니다. kind 매개변수를 통해 'bar', 'line', 'pie' 등 다양한 그래프 유형을 선택할 수 있습니다.
마무리 및 요약
지금까지 판다스의 groupby 함수에 대해 자세히 알아보았습니다.
groupby 함수는 데이터 분석에서 가장 많이 사용되는 기능 중 하나로,
복잡한 데이터에서 패턴과 인사이트를 발견하는 데 큰 도움이 됩니다.
주요 내용 정리
1. 기본 사용법: df.groupby('열이름') 형태로 사용하여 데이터를 그룹화합니다.
2. 집계 함수: sum(), mean(), count() 등 다양한 집계 함수를 적용할 수 있습니다.
3. 다중 열 그룹화: df.groupby(['열1', '열2']) 형태로 여러 열을 기준으로 그룹화할 수 있습니다.
4. 고급 기능: apply(), filter() 등을 사용하여 복잡한 작업을 수행할 수 있습니다.
5. 시각화: 그룹화된 데이터는 시각화하기 좋은 형태입니다.
판다스의 groupby 함수는 처음에는 복잡해 보일 수 있지만,
기본 개념을 이해하고 몇 가지 예제를 실습해보면 금방 익숙해질 수 있습니다.
데이터 분석 작업을 할 때 groupby 함수를 적극 활용하여 더 효율적이고 통찰력 있는 분석을 수행해보세요!
판다스의 groupby 외에도 pivot_table, crosstab 등의 함수도 데이터 그룹화와 집계에 유용합니다. 이러한 함수들도 함께 학습하면 데이터 분석 능력을 한층 더 향상시킬 수 있습니다.
[ 파이썬 관련 블로그 글 목록 ]
파이썬(Python) 블로그 목록
'PYTHON 엑셀' 카테고리의 다른 글
[ 판다스(Pandas) ] Pandas shape와 columns 속성 완벽 가이드: PySide 테이블 위젯 연동 방법 (0) | 2025.05.24 |
---|---|
[ 판다스(Pandas) ] DataFrame의 columns.tolist() 메서드 완벽 가이드: 데이터 분석 효율성 높이기 (0) | 2025.05.20 |
[ 판다스(Pandas) ] 데이터 접근 함수 가이드: iloc, loc, at, iat 총정리 (0) | 2025.05.16 |
[ 판다스(Pandas) ] read_excel 함수 기본 설명 (0) | 2025.05.15 |