Polars - 빠른 DataFrame 라이브러리 치트시트
Polars는 Rust로 작성된 고성능 DataFrame 라이브러리로, Python, R, Node 바인딩이 있습니다. 기본적으로 다중 스레드이고, Apache Arrow 컬럼 메모리로 구축되며, 지연 API 및 실행 전에 작업을 재정렬하고 제거하는 쿼리 옵티마이저를 제공합니다. 큰 데이터셋에서는 일반적으로 pandas보다 많은 배수 빠르고 메모리를 덜 사용하며, 표현식 API는 더 깔끔하게 조합됩니다. 2026년 새로운 데이터 작업의 기본 권장사항이 되었습니다.
설치
| 방법 | 명령 |
|---|
| pip | pip install polars |
| uv | uv add polars |
| 추가 포함 | pip install "polars[all]" (excel, database, plotting) |
| 확인 | python -c "import polars as pl; print(pl.__version__)" |
읽기 및 쓰기
| 작업 | 코드 |
|---|
| CSV | pl.read_csv("data.csv") |
| Parquet | pl.read_parquet("data.parquet") |
| JSON | pl.read_json("data.json") |
| 데이터베이스 | pl.read_database(query, connection) |
| 지연 CSV | pl.scan_csv("data.csv") (지연) |
| 지연 Parquet | pl.scan_parquet("*.parquet") |
| 쓰기 | df.write_parquet("out.parquet") |
Eager vs Lazy (핵심 아이디어)
import polars as pl
# Eager: 즉시 실행
df = pl.read_csv("sales.csv")
result = df.filter(pl.col("amount") > 100).group_by("region").agg(pl.col("amount").sum())
# Lazy: 계획을 구축한 후 최적화하고 .collect()에서 실행
result = (
pl.scan_csv("sales.csv")
.filter(pl.col("amount") > 100)
.group_by("region")
.agg(pl.col("amount").sum())
.collect()
)
지연 모드는 옵티마이저가 필터를 스캔으로 푸시하고 필요한 열만 읽게 합니다. 큰 파일에서 종종 큰 속도 향상입니다. 실제 워크로드를 위해 scan_* + .collect()를 선호하세요.
표현식 (핵심 API)
| 표현식 | 수행 |
|---|
pl.col("x") | 열 참조 |
pl.col("x").sum() | 집계 |
pl.col("x").alias("y") | 출력 이름 바꾸기 |
pl.col("*") | 모든 열 |
pl.lit(5) | 리터럴 값 |
pl.when(cond).then(a).otherwise(b) | 조건부 |
선택 및 필터링
| 작업 | 코드 |
|---|
| 열 선택 | df.select("a", "b") |
| 계산된 열 | df.with_columns((pl.col("a") * 2).alias("a2")) |
| 행 필터링 | df.filter(pl.col("a") > 10) |
| 여러 조건 | df.filter((pl.col("a") > 10) & (pl.col("b") == "x")) |
| Head/tail | df.head(10), df.tail(10) |
| 정렬 | df.sort("a", descending=True) |
| 고유 | df.unique(subset=["a"]) |
집계 및 그룹화
(df.group_by("region")
.agg(
pl.col("amount").sum().alias("total"),
pl.col("amount").mean().alias("avg"),
pl.col("order_id").n_unique().alias("orders"),
))
| 집계 | 표현식 |
|---|
| Sum/mean/min/max | .sum(), .mean(), .min(), .max() |
| Count | .count(), .n_unique() |
| First/last | .first(), .last() |
| Quantile | .quantile(0.95) |
| List collect | .implode() |
조인
| 유형 | 코드 |
|---|
| Inner | a.join(b, on="id") |
| Left | a.join(b, on="id", how="left") |
| Outer | a.join(b, on="id", how="full") |
| Anti | a.join(b, on="id", how="anti") |
| Semi | a.join(b, on="id", how="semi") |
| As-of (시간) | a.join_asof(b, on="ts") |
문자열, 날짜, 리스트
| 네임스페이스 | 예시 |
|---|
.str | pl.col("s").str.to_uppercase(), .str.contains("x") |
.dt | pl.col("t").dt.year(), .dt.truncate("1h") |
.list | pl.col("l").list.len(), .list.first() |
.cast | pl.col("a").cast(pl.Int64) |
상호운용
| 대상 | 코드 |
|---|
| pandas | df.to_pandas() / pl.from_pandas(pdf) |
| Arrow | df.to_arrow() |
| NumPy | df.to_numpy() |
| DuckDB | DuckDB에서 직접 Polars 프레임 쿼리 |
Polars vs pandas
| 측면 | Polars | pandas |
|---|
| 엔진 | Rust, 다중 스레드 | Python/C, 주로 단일 스레드 |
| 메모리 | Arrow 컬럼 | NumPy 기반 |
| 지연 옵티마이저 | 예 | 아니오 |
| API | 표현식 기반, 조합형 | 인덱스 중심 |
| 생태계 | 빠르게 성장 | 광대함, 성숙 |
SQL-우선 파일 분석을 위해 DuckDB와 쌍을 이루세요; pandas는 생태계 폭으로 인해 가치 있습니다.
리소스