pandas 100제: 판다스 연습문제와 풀이 · 8장

071–080 그룹별 집계

groupby sum·mean, agg, named aggregation, unstack, pivot_table, size, transform, filter, 그룹별 최댓값 행 연습문제

5분 읽기

카페 매출 데이터로 그룹별 집계를 연습합니다. 준비 코드에 매출 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: int64

072. 그룹 평균

메뉴별 평균 판매 수량을 구하세요.

정답 보기
Pythonsales.groupby('menu')['qty'].mean()
결과menu
라떼          15.000000
아메리카노    27.666667
케이크         8.000000
Name: qty, dtype: float64

073. 여러 집계 한 번에

매장별 수량의 합계·평균·최댓값을 구하세요.

정답 보기
Pythonsales.groupby('store')['qty'].agg(['sum', 'mean', 'max'])
결과       sum   mean  max
store                 
강남    85  21.25   30
홍대    59  14.75   25

074. 이름 붙인 집계

메뉴별 총수량(qty 합)과 총매출(revenue 합)을 구하세요.

정답 보기
Pythonsales.groupby('menu').agg(총수량=('qty', 'sum'), 총매출=('revenue', 'sum'))
결과            총수량  총매출
menu                      
라떼            45  225000
아메리카노      83  373500
케이크          16  104000

075. 두 기준으로 묶어 펼치기

매장 × 메뉴별 수량 합계를 구하고, 메뉴를 열로 펼치세요.

정답 보기
Pythonsales.groupby(['store', 'menu'])['qty'].sum().unstack()
결과menu   라떼  아메리카노  케이크
store                          
강남     18          58       9
홍대     27          25       7

076. 피벗 테이블

날짜를 행, 매장을 열로 하는 매출 합계 표를 만드세요.

정답 보기
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   75000

077. 그룹 크기

메뉴별 판매 기록(행) 수를 구하세요.

정답 보기
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.6

079. 조건에 맞는 그룹만

총매출이 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.6

080. 그룹별 최댓값 행

매장별로 매출이 가장 큰 판매 기록을 구하세요.

정답 보기
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

전체 메뉴