파이썬 pandas 데이터 분석 입문 · 6장
groupby와 pivot_table로 그룹별 집계
groupby 원리, agg로 여러 집계, 두 기준 묶기, pivot_table, 구성비 구하기
"매장별 매출은?", "메뉴별 평균 판매량은?" 같은 질문은 모두 그룹별 집계입니다. pandas에서는 groupby와 pivot_table로 답합니다. 2장의 sales(revenue 열 포함)를 씁니다.
groupby의 원리 — 나누고, 계산하고, 합치기
groupby는 세 단계로 움직입니다. 같은 값끼리 행을 나누고(split), 그룹마다 합계 같은 계산을 적용하고(apply), 결과를 하나의 표로 합칩니다(combine).
Pythonsales.groupby('store')['revenue'].sum()
결과store
강남 409500
홍대 293000
Name: revenue, dtype: int64
여러 값을 한 번에 — agg
agg에 새 열 이름=(대상 열, 함수)를 넘기면 여러 집계를 이름 붙여 한 번에 구할 수 있습니다.
Python(sales.groupby('menu')
.agg(총수량=('qty', 'sum'), 평균수량=('qty', 'mean'), 매출=('revenue', 'sum'))
.sort_values('매출', ascending=False))
결과 총수량 평균수량 매출
menu
아메리카노 83 27.666667 373500
라떼 45 15.000000 225000
케이크 16 8.000000 104000
자주 쓰는 집계 함수는 sum, mean, median, count, min, max, nunique(고유한 값의 개수)입니다.
두 기준으로 묶기
리스트로 여러 열을 넘기면 두 단계로 묶습니다.
Pythonsales.groupby(['store', 'menu'])['qty'].sum()
결과store menu
강남 라떼 18
아메리카노 58
케이크 9
홍대 라떼 27
아메리카노 25
케이크 7
Name: qty, dtype: int64
pivot_table — 엑셀 피벗 테이블처럼
두 기준의 결과는 표 모양으로 보는 편이 훨씬 읽기 쉽습니다. 행(index), 열(columns), 값(values), 집계 방법(aggfunc)을 정해 줍니다.
Pythonsales.pivot_table(index='store', columns='menu', values='revenue',
aggfunc='sum', fill_value=0)
결과menu 라떼 아메리카노 케이크
store
강남 90000 261000 58500
홍대 135000 112500 45500
강남은 아메리카노, 홍대는 라떼 매출이 가장 높다는 것이 한눈에 보입니다.
비율 구하기
그룹 합계를 전체 합계로 나누면 구성비가 됩니다.
Pythonshare = sales.groupby('menu')['revenue'].sum() / sales['revenue'].sum() * 100
share.round(1)
결과menu
라떼 32.0
아메리카노 53.2
케이크 14.8
Name: revenue, dtype: float64
직접 해 보기
날짜별로 판매된 메뉴 종류 수와 총 판매 수량을 구해 보세요.
Pythonsales.groupby('date').agg(메뉴수=('menu', 'nunique'), 총수량=('qty', 'sum'))