Pandas 데이터 정렬 & 필터링 완전 정복
그로스 마케팅 부트캠프 Day 4 수업 내용. 광고 캠페인 성과 데이터를 pandas로 정렬하고 필터링하는 실무 패턴을 익혔다. 엑셀로 하던 피벗·필터 작업을 코드 한 줄로 처리하는 감각을 체득!
- 왜 Pandas인가? — 엑셀 vs Pandas
- 오늘 사용할 데이터 구조
- 데이터 정렬 — sort_values()
- 데이터 필터링 — Boolean Indexing vs query()
- 특수 필터링 — isin() / str.contains() / between()
- 정렬 + 필터링 결합 — 실무 패턴
- 통계 함수 — mean vs median
- 치트시트 & 오늘의 핵심
1. 왜 Pandas인가? — 엑셀 vs Pandas
엑셀로도 데이터 분석은 할 수 있다. 근데 아래 표를 보면 왜 Pandas를 배워야 하는지 바로 느껴진다.
▲ 같은 상황, 엑셀과 Pandas의 차이
캠페인 데이터가 10만 행이 넘어가는 순간 엑셀은 버벅이기 시작한다. Pandas는 100만 행도 10초 안에 처리한다. 마케터에게 Pandas는 엑셀의 업그레이드 버전이다.
2. 오늘 사용할 데이터 구조
실제 Meta Ads / Google Ads 리포트와 비슷한 구조의 데이터를 기준으로 모든 예제를 실습했다.
import pandas as pd
data = {
"캠페인명": ["신규유저_봄할인", "리타겟팅_장바구니", "브랜드인지_여름",
"리텐션_VIP", "신규유저_앱설치"],
"채널": ["Meta", "Meta", "Google", "카카오", "Google"],
"광고비": [1200000, 850000, 2300000, 450000, 1750000],
"클릭수": [3200, 1850, 4100, 920, 3600],
"전환수": [128, 204, 89, 98, 144],
"매출액": [3840000, 6120000, 2670000, 4900000, 4320000],
}
df = pd.DataFrame(data)
# 자주 쓰는 지표 미리 계산
df["ROAS"] = (df["매출액"] / df["광고비"]).round(2)
df["CPC"] = (df["광고비"] / df["클릭수"]).round(0)
df["전환율"] = (df["전환수"] / df["클릭수"] * 100).round(2)
용어 정리: ROAS = 매출액 ÷ 광고비 (광고 1원으로 몇 원 벌었는지) / CPC = 광고비 ÷ 클릭수 (클릭 한 번당 비용) / 전환율 = 전환수 ÷ 클릭수 × 100
3. 데이터 정렬 — sort_values()
엑셀에서 특정 열 기준으로 오름차순/내림차순 정렬하는 것과 똑같다. sort_values(by="열이름") 한 줄이 핵심.
▲ sort_values() — 기본, 복수 기준, 유용한 옵션들
기본 정렬
# ROAS 높은 순 (내림차순) — 성과 좋은 캠페인 찾기
roas_ranking = df.sort_values(by="ROAS", ascending=False)
print(roas_ranking[["캠페인명", "광고비", "매출액", "ROAS"]])
# CPC 낮은 순 (오름차순) — 클릭 효율 좋은 캠페인 찾기
cpc_ranking = df.sort_values(by="CPC", ascending=True)
print(cpc_ranking[["캠페인명", "클릭수", "CPC"]])
리텐션_VIP 450,000 4,900,000 10.89
리타겟팅_장바구니 850,000 6,120,000 7.20
신규유저_봄할인 1,200,000 3,840,000 3.20
신규유저_앱설치 1,750,000 4,320,000 2.47
브랜드인지_여름 2,300,000 2,670,000 1.16
여러 기준으로 동시에 정렬
# 채널별로 묶은 다음, 각 채널 안에서 ROAS 높은 순
channel_report = df.sort_values(
by=["채널", "ROAS"],
ascending=[True, False] # 채널: 가나다순, ROAS: 내림차순
)
print(channel_report[["채널", "캠페인명", "ROAS", "전환율"]])
# 효율 점수 컬럼 직접 만들어서 정렬
df["효율점수"] = (df["ROAS"] * df["전환율"]).round(2)
best = df.sort_values(by="효율점수", ascending=False)
print(best[["캠페인명", "ROAS", "전환율", "효율점수"]])
ascending에도 기준 개수만큼 True/False를 넣어야 한다. 기준이 2개면 ascending=[True, False] 처럼 2개를 넣는다.
4. 데이터 필터링 — Boolean Indexing vs query()
필터링은 조건을 만족하는 행만 골라내는 것. 엑셀의 자동필터와 같은 개념이다. 2가지 방법이 있다.
▲ Boolean Indexing vs query() — 같은 결과, 다른 가독성
# Boolean Indexing 방식
high_roas = df[ df["ROAS"] >= 3 ]
# AND 조건 — 각 조건을 괄호로, & 사용 (and 아님!)
good = df[ (df["ROAS"] >= 3) & (df["클릭수"] >= 2000) ]
# OR 조건 — | 사용 (or 아님!)
notable = df[ (df["ROAS"] >= 5) | (df["전환수"] >= 150) ]
# query() 방식 — 훨씬 읽기 쉬움
result = df.query("ROAS >= 3 and 클릭수 >= 2000")
# 변수를 query 안에서 사용 — @ 기호 사용
target_roas = 3.0
high = df.query("ROAS >= @target_roas")
Pandas에서는 and, or 사용 불가! Boolean Indexing에서는 반드시 &(AND), |(OR), ~(NOT) 사용. 그리고 각 조건을 반드시 괄호로 감싸야 한다.
5. 특수 필터링 — isin() / str.contains() / between()
▲ isin() / str.contains() / between() — 문자열과 범위 필터링
# isin(): 특정 값들 중 하나라도 포함되면 True
perf_ch = df[ df["채널"].isin(["Meta", "Google"]) ]
# ~(NOT): 카카오 제외
no_kakao = df[ ~df["채널"].isin(["카카오"]) ]
# str.contains(): 캠페인명에 특정 단어 포함 여부
acq = df[ df["캠페인명"].str.contains("신규유저") ]
# | 로 OR 조건: "신규유저" 또는 "리타겟팅" 포함
multi = df[ df["캠페인명"].str.contains("신규유저|리타겟팅") ]
# between(): 광고비 50만 ~ 150만 사이
mid = df[ df["광고비"].between(500000, 1500000) ]
# ROAS 2.0 ~ 5.0 사이 — 개선 여지 있는 캠페인
mid_roas = df[ df["ROAS"].between(2.0, 5.0) ]
6. 정렬 + 필터링 결합 — 실무 패턴
실무에서는 필터링으로 범위를 좁힌 다음 정렬하는 방식을 가장 많이 쓴다. 순서: df[조건].sort_values(...)
# Google 채널만 → ROAS 높은 순 → 상위 3개
google_top3 = (
df[ df["채널"] == "Google" ] # ① 필터링
.sort_values(by="ROAS", ascending=False) # ② 정렬
.head(3) # ③ 상위 3개
)
print("Google Top 3 (ROAS 기준)")
print(google_top3[["캠페인명", "광고비", "ROAS", "전환율"]])
# 클릭은 많은데 전환 안 되는 캠페인 → 랜딩페이지 개선 대상
lp_fix = (
df[
(df["클릭수"] >= df["클릭수"].median()) & # 클릭 많음
(df["전환율"] < df["전환율"].mean()) # 전환율 낮음
]
.sort_values(by="전환율", ascending=True)
)
print("랜딩페이지 개선 우선순위:")
print(lp_fix[["캠페인명", "클릭수", "전환율", "ROAS"]])
7. 통계 함수 — mean vs median 차이
필터링에 평균(mean)과 중앙값(median)을 기준으로 쓰는 경우가 많다. 이 둘의 차이를 정확히 알아야 한다.
| 함수 | 의미 | 특징 | 사용 예 |
|---|---|---|---|
mean() |
평균 | 이상치에 민감 | 일반적인 성과 평균 |
median() |
중앙값 | 이상치에 강함 ✅ | 이상치 있을 때 기준 |
std() |
표준편차 | 데이터 분산 정도 | 성과 편차 확인 |
sum() |
합계 | 전체 총합 | 총 광고비, 총 매출 |
min() / max() |
최솟값/최댓값 | 범위 확인 | 최소·최대 ROAS |
mean vs median 실전 팁: 데이터에 이상치(너무 크거나 작은 값)가 섞여 있다면 mean()보다 median()이 더 정확한 '보통'의 기준이 된다. 월급 데이터에 억대 연봉이 1명 섞이면 평균은 실제보다 훨씬 높게 잡힌다.
8. 치트시트 & 오늘의 핵심
▲ 정렬 + 필터링 핵심 패턴 한눈에 — 실무에서 바로 쓰는 코드
🌿 오늘의 핵심 3가지
- 정렬은 sort_values(by="열이름", ascending=True/False) — 복수 기준은 리스트로, ascending도 리스트로.
- 필터링은 df[조건] 또는 df.query("조건") — Pandas에서 and→&, or→|, not→~. 각 조건은 괄호로 감싸야!
- 결합 패턴: df[조건].sort_values(...).head(N) — 필터링 → 정렬 → 상위 N개. 실무에서 가장 많이 쓰는 흐름.
- 문자열 필터링: isin() (리스트 포함 여부) / str.contains() (단어 포함) / between() (범위)
- 이상치 있는 데이터의 기준값은 mean 대신 median을 쓰는 게 더 정확하다.
'부트캠프' 카테고리의 다른 글
| 멋쟁이사자처럼 부트캠프 그로스마케팅 4기 22일차_260409 (0) | 2026.04.09 |
|---|---|
| 멋쟁이사자처럼 부트캠프 그로스마케팅 4기 21일차_260408 (2) | 2026.04.08 |
| 멋쟁이사자처럼 부트캠프 그로스마케팅 4기 18일차_260402(다른버전) (0) | 2026.04.07 |
| 멋쟁이사자처럼 부트캠프 그로스마케팅 4기 20일차_260407 (1) | 2026.04.07 |
| 멋쟁이사자처럼 부트캠프 그로스마케팅 4기 15일차_260330 (1) | 2026.03.30 |