콘텐츠로 이동

Polars - 빠른 DataFrame 라이브러리 치트시트

Polars - 빠른 DataFrame 라이브러리 치트시트

Polars는 Rust로 작성된 고성능 DataFrame 라이브러리로, Python, R, Node 바인딩이 있습니다. 기본적으로 다중 스레드이고, Apache Arrow 컬럼 메모리로 구축되며, 지연 API 및 실행 전에 작업을 재정렬하고 제거하는 쿼리 옵티마이저를 제공합니다. 큰 데이터셋에서는 일반적으로 pandas보다 많은 배수 빠르고 메모리를 덜 사용하며, 표현식 API는 더 깔끔하게 조합됩니다. 2026년 새로운 데이터 작업의 기본 권장사항이 되었습니다.

설치

방법명령
pippip install polars
uvuv add polars
추가 포함pip install "polars[all]" (excel, database, plotting)
확인python -c "import polars as pl; print(pl.__version__)"

읽기 및 쓰기

작업코드
CSVpl.read_csv("data.csv")
Parquetpl.read_parquet("data.parquet")
JSONpl.read_json("data.json")
데이터베이스pl.read_database(query, connection)
지연 CSVpl.scan_csv("data.csv") (지연)
지연 Parquetpl.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/taildf.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()

조인

유형코드
Innera.join(b, on="id")
Lefta.join(b, on="id", how="left")
Outera.join(b, on="id", how="full")
Antia.join(b, on="id", how="anti")
Semia.join(b, on="id", how="semi")
As-of (시간)a.join_asof(b, on="ts")

문자열, 날짜, 리스트

네임스페이스예시
.strpl.col("s").str.to_uppercase(), .str.contains("x")
.dtpl.col("t").dt.year(), .dt.truncate("1h")
.listpl.col("l").list.len(), .list.first()
.castpl.col("a").cast(pl.Int64)

상호운용

대상코드
pandasdf.to_pandas() / pl.from_pandas(pdf)
Arrowdf.to_arrow()
NumPydf.to_numpy()
DuckDBDuckDB에서 직접 Polars 프레임 쿼리

Polars vs pandas

측면Polarspandas
엔진Rust, 다중 스레드Python/C, 주로 단일 스레드
메모리Arrow 컬럼NumPy 기반
지연 옵티마이저아니오
API표현식 기반, 조합형인덱스 중심
생태계빠르게 성장광대함, 성숙

SQL-우선 파일 분석을 위해 DuckDB와 쌍을 이루세요; pandas는 생태계 폭으로 인해 가치 있습니다.

리소스