Pandas는 10년 넘게 Python 데이터 분석의 표준이었다. 2026년 현재도 널리 쓰이고 있지만, 더 이상 당연한 선택은 아니다. 차세대 라이브러리들이 훨씬 뛰어난 성능, 낮은 메모리 사용량, 더 직관적인 API를 제공하고 있다.
이 글에서는 주요 선택지를 비교하고 유스케이스별로 적합한 라이브러리를 살펴본다.
주요 라이브러리
| 라이브러리 | 성숙도 | 구현 언어 | 핵심 강점 |
|---|---|---|---|
| Pandas 2.2 | 성숙 | C/Python | 생태계, 보편성 |
| Polars 1.x | 안정 | Rust | 속도, 메모리 효율 |
| DuckDB 1.x | 안정 | C++ | SQL 인터페이스, 제로카피 |
| Modin | 안정 | Python | Pandas 드롭인 대체 |
| Vaex | 유지보수 모드 | C++/Python | 아웃오브코어 처리 |
| DataFusion (Python) | 성장 중 | Rust | Apache Arrow 네이티브 |
성능: 벤치마크가 보여주는 것
조작된 수치가 아닌 공식 및 서드파티 벤치마크 결과를 정리했다.
Polars PDS-H 벤치마크 (TPC-H 파생)
Polars 팀은 TPC-H 의사결정 지원 벤치마크를 기반으로 한 오픈소스 벤치마크 스위트 PDS-H를 운영하고 있다. 최신 결과(2025년 5월)는 표준화된 분석 쿼리에서 Polars와 다른 엔진을 비교한다.
주요 결과:
- Polars는 22개 TPC-H 파생 쿼리 전체에서 Pandas를 큰 차이로 앞선다
- 동일 작업에서 Polars의 메모리 사용량이 Pandas보다 크게 적다
- 벤치마크는 GitHub에서 오픈소스로 공개되어 있어 재현 가능
에너지 및 성능 연구
별도의 Polars 에너지 벤치마크 연구에 따르면, 대규모 DataFrame 합성 데이터 분석 작업에서 Polars의 에너지 소비는 Pandas의 약 8분의 1이며, 대용량 데이터셋의 TPC-H 스타일 쿼리에서는 Pandas 대비 약 63%의 에너지만 소비했다.
전반적인 성능 경향
공개 벤치마크와 커뮤니티 리포트 기반:
- Polars와 DuckDB는 대부분의 분석 작업에서 Pandas보다 크게 빠르며, 특히 100만 행 이상의 데이터셋에서 그 차이가 두드러진다
- DuckDB는 집계 및 조인이 많은 워크로드에서 특히 강하다
- Modin은 Pandas 대비 소폭 개선되지만 메모리 사용량이 늘어난다
- Pandas 2.x의 Arrow 기반 dtype은 1.x 대비 체감할 수 있을 만큼 빠르다
참고: 정확한 성능 비율은 하드웨어, 데이터 형태, 쿼리 복잡도에 크게 좌우된다. 반드시 실제 워크로드에서 벤치마크할 것.
Polars — 성능 중심 프로젝트의 새로운 기본
성능이 중요한 신규 프로젝트에서 Polars는 Pandas의 가장 유력한 대안으로 자리잡았다.
import polars as pl
df = pl.read_parquet("events.parquet")
result = (
df.lazy()
.filter(pl.col("event_type") == "purchase")
.group_by("user_id")
.agg([
pl.col("amount").sum().alias("total_spent"),
pl.col("amount").count().alias("num_purchases"),
])
.sort("total_spent", descending=True)
.head(100)
.collect()
)
Polars가 돋보이는 이유:
- 대부분의 연산에서 Pandas보다 훨씬 빠름 — PDS-H 공식 벤치마크로 확인 (출처)
- 지연 평가로 실행 전 쿼리 플랜을 최적화.
.lazy()와.collect()만 추가하면 가장 큰 성능 최적화를 얻을 수 있다 - 일관된 API로 Pandas의 고질적 문제(
SettingWithCopyWarning등)를 회피 - Rust 기반 네이티브 병렬 처리 — 기본적으로 모든 코어 활용
솔직한 단점:
- 생태계 격차: 많은 라이브러리가 여전히 Pandas DataFrame을 요구한다.
.to_pandas()변환이 불가피한 경우가 있다 - 시각화 연동이 약함 — Matplotlib/Seaborn은 Pandas 입력을 전제로 한다
- API가 상당히 달라 실질적인 학습 비용이 있다. Pandas 숙련 팀도 전환에 약 1주일은 잡아야 한다
DuckDB — SQL을 선호할 때의 최적 선택
DuckDB는 DataFrame 라이브러리가 아니라 임베디드 분석 데이터베이스다. 하지만 Python에서 데이터를 분석하는 가장 좋은 방법 중 하나가 되었다.
import duckdb
result = duckdb.sql("""
SELECT
user_id,
SUM(amount) as total_spent,
COUNT(*) as num_purchases
FROM read_parquet('events.parquet')
WHERE event_type = 'purchase'
GROUP BY user_id
ORDER BY total_spent DESC
LIMIT 100
""").fetchdf()
DuckDB의 매력:
- 뛰어난 집계 성능 — groupby·조인에서 Polars와 대등하거나 더 빠름
- 제로카피 통합 — Pandas, Polars, Arrow 데이터를 복사 없이 SQL에서 직접 참조
- Parquet, CSV, JSON 직접 읽기 — 별도 로딩 단계 불필요
- 임베디드 — 서버 없이, 설정 없이
pip install duckdb만으로 사용 가능
Polars 대신 DuckDB를 고를 때:
- 팀이 메서드 체이닝보다 SQL에 익숙할 때
- 파이프라인 없이 파일을 직접 쿼리하고 싶을 때
- 여러 포맷(CSV + Parquet + JSON)을 조인해야 할 때
DuckDB 대신 Polars가 나을 때:
- 복잡한 다단계 변환 (메서드 체이닝이 중첩 SQL보다 읽기 쉬움)
- Python 코드로 데이터 파이프라인을 구축할 때
- 실행에 대한 세밀한 제어가 필요할 때
Pandas 2.2 — 아직 현역 (단, 조건부)
Pandas는 죽지 않았다. 2.x의 Arrow 기반 dtype 덕분에 1.x보다 상당히 빨라졌다:
import pandas as pd
# Arrow dtype으로 성능 향상
df = pd.read_parquet("events.parquet", dtype_backend="pyarrow")
Pandas를 계속 쓸 만한 경우:
- 팀이 이미 잘 알고 있고 성능이 충분할 때
- 라이브러리 호환성이 최우선일 때 (scikit-learn, statsmodels 등)
- 소규모 데이터셋 (100만 행 미만)으로 성능 차이가 무시할 수 있을 때
- Jupyter 노트북에서 탐색적 분석을 할 때
대안을 고려해야 할 경우:
- 데이터셋이 가용 RAM을 초과할 때
- 성능이 중요한 프로덕션 데이터 파이프라인 구축 시
- 1,000만 행 이상의 데이터셋을 일상적으로 다룰 때
Modin — 추천하기 어려운 선택
Modin은 import 한 줄만 바꾸면 Pandas가 빨라진다고 약속한다. 현실에서는 트레이드오프가 크다:
- Pandas 자체보다 메모리 사용량이 더 높음 (프로세스 간 데이터 분산 때문)
- API 커버리지 불완전 — 일부 연산이 조용히 Pandas로 폴백
- 시작 오버헤드 때문에 소규모 데이터셋에서는 오히려 느림
- 분산 실행에서 문제 발생 시 디버깅 복잡도 증가
평가: 대부분의 팀에게는 호환성이 필요하면 Pandas를 유지하고, 성능이 필요하면 Polars로 전환하는 것이 낫다. Modin은 두 목표 어느 쪽도 충분히 달성하지 못하는 애매한 위치에 있다.
선택 프레임워크
데이터가 100만 행 미만?
→ Pandas (Arrow dtype 사용)로 충분. 고민하지 말 것.
팀이 SQL 중심?
→ DuckDB.
Python 데이터 파이프라인 구축?
→ Polars.
파일을 로드하지 않고 바로 쿼리?
→ DuckDB.
단일 머신에서 1억 행 이상?
→ Polars (lazy 모드) 또는 DuckDB.
데이터가 가용 RAM보다 클 때?
→ DuckDB 또는 Polars (스트리밍 모드).
참고 자료
- Polars PDS-H 벤치마크 결과 (2025년 5월)
- Polars 에너지 및 성능 연구
- Polars 벤치마크 저장소 (GitHub)
- DuckDB 공식 문서
- Pandas 2.x Arrow 백엔드
Pandas에서의 마이그레이션에 대해 궁금한 점이 있다면 [email protected]으로 문의 바랍니다.