pandas 100제: 판다스 연습문제와 풀이 · 8장
071–080 그룹별 집계
groupby sum·mean, agg, named aggregation, unstack, pivot_table, size, transform, filter, 그룹별 최댓값 행 연습문제
카페 매출 데이터로 그룹별 집계를 연습합니다. 준비 코드에 매출 revenue 열이 들어 있습니다.
준비 코드
이 장의 문제는 아래 코드를 먼저 실행한 상태에서 풉니다.
Pythonimport pandas as pd
sales = pd.DataFrame({
'date': ['2026-03-01', '2026-03-01', '2026-03-02', '2026-03-02',
'2026-03-03', '2026-03-03', '2026-03-04', '2026-03-04'],
'store': ['강남', '홍대', '강남', '홍대', '강남', '홍대', '강남', '홍대'],
'menu': ['아메리카노', '라떼', '라떼', '아메리카노', '아메리카노', '케이크', '케이크', '라떼'],
'qty': [30, 12, 18, 25, 28, 7, 9, 15],
'price': [4500, 5000, 5000, 4500, 4500, 6500, 6500, 5000],
})
sales['revenue'] = sales['qty'] * sales['price']
071. 그룹 합계
매장별 매출 합계를 구하세요.
정답 보기
Pythonsales.groupby('store')['revenue'].sum()
결과store
강남 409500
홍대 293000
Name: revenue, dtype: int64072. 그룹 평균
메뉴별 평균 판매 수량을 구하세요.
정답 보기
Pythonsales.groupby('menu')['qty'].mean()
결과menu
라떼 15.000000
아메리카노 27.666667
케이크 8.000000
Name: qty, dtype: float64073. 여러 집계 한 번에
매장별 수량의 합계·평균·최댓값을 구하세요.
정답 보기
Pythonsales.groupby('store')['qty'].agg(['sum', 'mean', 'max'])
결과 sum mean max
store
강남 85 21.25 30
홍대 59 14.75 25074. 이름 붙인 집계
메뉴별 총수량(qty 합)과 총매출(revenue 합)을 구하세요.
정답 보기
Pythonsales.groupby('menu').agg(총수량=('qty', 'sum'), 총매출=('revenue', 'sum'))
결과 총수량 총매출
menu
라떼 45 225000
아메리카노 83 373500
케이크 16 104000075. 두 기준으로 묶어 펼치기
매장 × 메뉴별 수량 합계를 구하고, 메뉴를 열로 펼치세요.
정답 보기
Pythonsales.groupby(['store', 'menu'])['qty'].sum().unstack()
결과menu 라떼 아메리카노 케이크
store
강남 18 58 9
홍대 27 25 7076. 피벗 테이블
날짜를 행, 매장을 열로 하는 매출 합계 표를 만드세요.
정답 보기
Pythonsales.pivot_table(index='date', columns='store', values='revenue', aggfunc='sum')
결과store 강남 홍대
date
2026-03-01 135000 60000
2026-03-02 90000 112500
2026-03-03 126000 45500
2026-03-04 58500 75000077. 그룹 크기
메뉴별 판매 기록(행) 수를 구하세요.
정답 보기
Pythonsales.groupby('menu').size()
결과menu
라떼 3
아메리카노 3
케이크 2
dtype: int64
size는 빈 값도 셉니다. count는 빈 값을 뺍니다.
078. 그룹 안 비율
각 행의 매출이 해당 매장 전체 매출의 몇 %인지 share 열로 구하세요.
정답 보기
Pythonstore_total = sales.groupby('store')['revenue'].transform('sum')
sales['share'] = (sales['revenue'] / store_total * 100).round(1)
sales[['store', 'menu', 'revenue', 'share']]
결과 store menu revenue share
0 강남 아메리카노 135000 33.0
1 홍대 라떼 60000 20.5
2 강남 라떼 90000 22.0
3 홍대 아메리카노 112500 38.4
4 강남 아메리카노 126000 30.8
5 홍대 케이크 45500 15.5
6 강남 케이크 58500 14.3
7 홍대 라떼 75000 25.6079. 조건에 맞는 그룹만
총매출이 20만 원 이상인 메뉴의 행만 남기세요.
정답 보기
Pythonsales.groupby('menu').filter(lambda g: g['revenue'].sum() >= 200000)
결과 date store menu qty price revenue share
0 2026-03-01 강남 아메리카노 30 4500 135000 33.0
1 2026-03-01 홍대 라떼 12 5000 60000 20.5
2 2026-03-02 강남 라떼 18 5000 90000 22.0
3 2026-03-02 홍대 아메리카노 25 4500 112500 38.4
4 2026-03-03 강남 아메리카노 28 4500 126000 30.8
7 2026-03-04 홍대 라떼 15 5000 75000 25.6080. 그룹별 최댓값 행
매장별로 매출이 가장 큰 판매 기록을 구하세요.
정답 보기
Pythonsales.loc[sales.groupby('store')['revenue'].idxmax()]
결과 date store menu qty price revenue share
0 2026-03-01 강남 아메리카노 30 4500 135000 33.0
3 2026-03-02 홍대 아메리카노 25 4500 112500 38.4