============================================================
Day 5. merge()를 이용한 데이터 결합과 매출 분석
난이도: 중급 입문
============================================================
[1. 문제 설명]
온라인 쇼핑몰의 제품 정보와 판매 정보가 서로 다른 DataFrame에 저장되어 있습니다.
제품ID를 기준으로 두 데이터를 결합하고 제품별 매출액을 계산하세요.
[2. 요구사항]
1. 제품ID를 기준으로 두 DataFrame을 결합하세요.
2. 제품 정보가 존재하지 않는 주문을 찾으세요.
3. 정상 주문의 매출액을 계산하세요.
4. 제품별 총판매수량과 총매출액을 계산하세요.
5. 매출액이 높은 순서대로 정렬하세요.
매출액 = 가격 × 판매수량
[3. 실습 데이터]
import pandas as pd
products = pd.DataFrame({
'제품ID': ['P001', 'P002', 'P003', 'P004', 'P005'],
'제품명': ['노트북', '마우스', '키보드', '모니터', '웹캠'],
'가격': [1200000, 30000, 80000, 350000, 90000]
})
sales = pd.DataFrame({
'주문ID': ['O101', 'O102', 'O103', 'O104',
'O105', 'O106', 'O107'],
'제품ID': ['P001', 'P002', 'P001', 'P003',
'P004', 'P002', 'P999'],
'판매수량': [2, 5, 1, 3, 2, 10, 4]
})
[4. 힌트]
pd.merge() : 두 DataFrame 결합
how='left' : 왼쪽 데이터의 모든 행 유지
indicator=True : 결합 여부를 _merge 열에 표시
groupby() : 제품별 그룹화
agg() : 여러 통계값을 한 번에 계산
[5. 예상 결과]
제품 정보가 없는 주문
O107 / P999
제품명 총판매수량 총매출액
노트북 3 3600000
모니터 2 700000
마우스 15 450000
키보드 3 240000
전체 매출: 4990000
[6. 정답 코드]
merged = pd.merge(
sales,
products,
on='제품ID',
how='left',
validate='many_to_one',
indicator=True
)
unknown = merged.loc[
merged['_merge'] == 'left_only'
]
print("제품 정보가 없는 주문")
print(unknown[['주문ID', '제품ID']].to_string(index=False))
valid = merged.loc[
merged['_merge'] == 'both'
].copy()
valid['매출액'] = valid['가격'] * valid['판매수량']
result = (
valid.groupby(['제품ID', '제품명'], as_index=False)
.agg(
총판매수량=('판매수량', 'sum'),
총매출액=('매출액', 'sum')
)
.sort_values('총매출액', ascending=False)
)
print("\n제품별 매출")
print(result.to_string(index=False))
print("전체 매출:", result['총매출액'].sum())