Pandas 면접 문제집
샘플 3문제전체 25문제
데이터 분석가 코딩 테스트에서 자주 출제되는 Pandas 문제들입니다. 각 문제는 문제 → 정답 → 해설 → 면접 포인트 순서로 구성되어 있습니다.
🟢 샘플 문제 (3/25)
문제 1. 기본 필터링과 정렬
초급
제한시간: 5분
[문제] 다음 조건을 만족하는 데이터를 추출하세요.
- 카테고리가 ‘Jeans’ 또는 ‘Dresses’
- 판매가격이 50달러 이상
- 판매가격 내림차순 정렬
import pandas as pd
DATA_PATH = '/data/'
order_items = pd.read_csv(DATA_PATH + 'src_order_items.csv')
products = pd.read_csv(DATA_PATH + 'src_products.csv')
df = order_items.merge(products, on='product_id')
# 여기에 코드 작성✅ 정답 코드
# 방법 1: 불리언 인덱싱
result = df[
(df['category'].isin(['Jeans', 'Dresses'])) &
(df['sale_price'] >= 50)
].sort_values('sale_price', ascending=False)
# 방법 2: query() 사용
result = df.query(
"category in ['Jeans', 'Dresses'] and sale_price >= 50"
).sort_values('sale_price', ascending=False)
print(f"결과: {len(result):,}행")
print(result[['category', 'sale_price', 'name']].head())📖 상세 해설
query() vs 불리언 인덱싱:
| 방법 | 장점 | 단점 |
|---|---|---|
| 불리언 인덱싱 | 가장 기본적, 항상 동작 | 조건 많으면 가독성 ↓ |
| query() | SQL 스타일, 가독성 ↑ | 문자열 파싱 오버헤드 |
| loc[] | 레이블 기반, 슬라이싱 가능 | 조건 표현 제한적 |
isin() 팁:
# ❌ OR 연산자 반복
df[(df['cat'] == 'A') | (df['cat'] == 'B') | (df['cat'] == 'C')]
# ✅ isin() 사용
df[df['cat'].isin(['A', 'B', 'C'])]면접관 포인트:
“query()와 불리언 인덱싱의 성능 차이는?” → 대부분 비슷, 가독성 기준 선택
문제 2. GroupBy 기본
초급
제한시간: 5분
[문제] 브랜드별 총 매출, 평균 가격, 상품 수를 계산하고, 총 매출 기준 상위 10개를 출력하세요.
✅ 정답 코드
result = df.groupby('brand').agg(
total_revenue=('sale_price', 'sum'),
avg_price=('sale_price', 'mean'),
product_count=('product_id', 'nunique')
).round(2).sort_values('total_revenue', ascending=False).head(10)
print(result)📖 상세 해설
agg() 문법 3가지:
# 1. 딕셔너리 방식 (컬럼: 함수)
df.groupby('brand')['sale_price'].agg({'합계': 'sum', '평균': 'mean'})
# 2. Named Aggregation (권장, pandas 0.25+)
df.groupby('brand').agg(
total=('sale_price', 'sum'),
average=('sale_price', 'mean')
)
# 3. 리스트 방식 (여러 함수)
df.groupby('brand')['sale_price'].agg(['sum', 'mean', 'count'])nunique vs count:
nunique(): 고유값 개수 (중복 제외)count(): NULL 제외 행 개수
문제 3. 결측치 처리
초급
제한시간: 5분
[문제] 결측치 현황을 파악하고, 수치형은 중앙값, 범주형은 최빈값으로 채우세요.
✅ 정답 코드
# 결측치 현황
print("=== 결측치 현황 ===")
print(df.isnull().sum()[df.isnull().sum() > 0])
# 수치형 컬럼: 중앙값
numeric_cols = df.select_dtypes(include=['number']).columns
for col in numeric_cols:
if df[col].isnull().sum() > 0:
median_val = df[col].median()
df[col] = df[col].fillna(median_val)
print(f"{col}: 중앙값({median_val:.2f})으로 대체")
# 범주형 컬럼: 최빈값
object_cols = df.select_dtypes(include=['object']).columns
for col in object_cols:
if df[col].isnull().sum() > 0:
mode_val = df[col].mode()[0]
df[col] = df[col].fillna(mode_val)
print(f"{col}: 최빈값({mode_val})으로 대체")📖 상세 해설
결측치 처리 전략:
| 상황 | 방법 | 코드 |
|---|---|---|
| 정규분포 | 평균 | fillna(df['col'].mean()) |
| 왜곡분포 | 중앙값 | fillna(df['col'].median()) |
| 범주형 | 최빈값 | fillna(df['col'].mode()[0]) |
| 시계열 | 전/후 값 | fillna(method='ffill') |
| 삭제 | dropna | dropna(subset=['col']) |
주의: inplace vs 할당
# ❌ 원본 변경 (권장하지 않음)
df.fillna(0, inplace=True)
# ✅ 새 객체 할당 (권장)
df = df.fillna(0)면접관 포인트:
“왜 평균 대신 중앙값을 선택했나요?” → 이상치 영향 최소화
🔒 프리미엄 문제 (22문제)
전체 25문제 구성
| 난이도 | 문제 수 | 주요 토픽 |
|---|---|---|
| 🟢 초급 | 8문제 | 필터링, GroupBy, 결측치, Merge, 문자열, 날짜 |
| 🟡 중급 | 9문제 | 피벗, Apply/Transform, Rolling, 조건부 컬럼, Melt |
| 🔴 고급 | 8문제 | RFM 분석, 코호트 리텐션, 메모리 최적화 |
프리미엄에서 배우는 내용
- ✅ apply vs transform vs agg: 언제 어떤 것을 쓰는지
- ✅ Rolling Window: 7일 이동평균, 누적 계산
- ✅ RFM 분석: 고객 세그먼테이션 실전 코드
- ✅ 코호트 리텐션: 실제 기업에서 사용하는 분석
- ✅ 메모리 최적화: 대용량 데이터 처리 기법
- ✅ 면접관이 기대하는 답변 포인트
🎯 전체 25문제 + 해설 구매하기
SQL + Pandas + 통계 + 케이스 스터디 번들 할인
📝 무료로 더 연습하기
면접 준비가 더 필요하다면, Cookbook의 개념 섹션을 복습하세요:
Last updated on