Polars로 CSV 파일 읽는 방법 설명
Updated on
Polars는 Python에서 빠른 DataFrame 라이브러리로, 구조화된 데이터 처리를 위한 친숙하고 강력한 인터페이스를 제공합니다. 특히 CSV 파일을 다룰 때, Polars는 pandas의 read_csv()
와 scan_csv()
와 유사한 간편한 메서드를 제공하여 빛을 발합니다. 이러한 메서드를 최대한 활용하는 방법을 알아봅시다.
read_csv()로 CSV 파일 가져오기
Polars는 CSV 파일을 가져오기 위한 사용하기 쉬운 read_csv()
메서드를 제공합니다. 그 문법은 pandas와 상당히 유사하여, pandas에 익숙한 사람들에게는 쉬운 전환을 도와줍니다. 다음은 빠른 데모입니다:
import polars as pl
# read_csv로 CSV 파일 가져오기
df = pl.read_csv('data_sample.csv')
print(df)
출력:
shape: (3, 4)
┌───────────┬───────┬─────┬───────────────────┐
│ studentId ┆ Name ┆ Age ┆ FirstEnrollment │
│ --- ┆ --- ┆ --- ┆ --- │
│ i64 ┆ str ┆ i64 ┆ str │
╞═══════════╪═══════╪═════╪═══════════════════╡
│ 1 ┆ Mike ┆ 24 ┆ 2020-01-17 │
│ 2 ┆ Sarah ┆ 33 ┆ 2021-07-23 │
│ 3 ┆ John ┆ 19 ┆ 2022-12-20 │
└───────────┴───────┴─────┴───────────────────┘
read_csv()를 사용하여 날짜 파싱하기
CSV 파일을 가져오는 동안 특정 열을 날짜-시간 객체로 파싱하고 싶은 경우가 있을 수 있습니다. 이 기능은 parse_dates=True
매개변수로 가능합니다. 예를 들면:
# 날짜 파싱을 포함한 CSV 파일 읽기
df_dates = pl.read_csv('data_sample.csv', parse_dates=True)
print(df_dates)
On-the-fly로 열의 데이터 유형 변경하기
파일을 읽는 동안 특정 열의 데이터 유형을 변경할 수도 있습니다. 예를 들어, 'Age' 열을 i64
에서 Int32
로 변환하는 방법은 다음과 같습니다:
# 특정 데이터 유형을 지정하여 CSV 파일 읽기
df_age_casted = pl.read_csv('data_sample.csv', parse_dates=True).with_column(pl.col('Age').cast(pl.Int32))
print(df_age_casted)
Polars는 DataFrame을 표시할 때 열 유형을 표시하여 데이터 유형 문제 해결을 용이하게 합니다.
scan_csv()로 읽기 최적화하기
대용량 데이터셋의 경우, Polars는 리소스를 더 효율적으로 사용할 수 있는 scan_csv()
메서드를 제공합니다. 지연 평가(lazy evaluation)를 활용하여 이 메서드는 데이터를 메모리에 필요할 때만 로드하며(즉, collect()
가 호출될 때), 메모리 오버헤드를 줄일 수 있습니다. 간단한 예시를 살펴보겠습니다:
# scan_csv로 효율적으로 읽기
q = pl.scan_csv('data_sample.csv')
df_lazy = q.collect()
print(df_lazy)
연산을 실행하려면 collect()
를 호출해야 하며, 그렇지 않으면 연산의 표현(계획)이 반환됩니다.
이것은 Polars가 CSV 파일과 상호작용하는 방법 중 일부입니다. 명확한 구문과 강력한 함수를 통해 Python에서 데이터 조작에 탁월한 도구로 사용할 수 있습니다.
Polars 표현식과 동작 이해하기
Polars는 즉시 실행과 지연 실행 두 가지 모드를 지원합니다. 즉시 실행 모드에서는 계산이 즉시 실행되지만, 지연 실행 모드에서는 연산이 대기열에 저장되고 필요할 때만 평가되어 효율성과 메모리 사용을 최적화합니다.
scan_csv()와 지연 평가 활용하기
scan_csv()
를 사용할 때 데이터가 즉시 메모리로 로드되지 않습니다. 대신 Polars는 수행할 연산을 포함하는 쿼리 계획을 구성합니다. 이 쿼리 계획은 collect()
가 호출될 때에만 실행됩니다. 이렇게 지연 평가라는 기법을 사용하면, 특히 대용량 데이터셋에서는 메모리 사용량을 더욱 효율적으로 줄이고 빠른 연산을 할 수 있습니다. 다음은 예시입니다:
# scan_csv를 사용한 지연 읽기
query = pl.scan_csv('data_sample.csv')
print(query)
위의 코드를 실행하면 연산의 "계획" 요약이 출력되지만, 연산 자체는 아직 실행되지 않습니다.
naive plan: (run LazyFrame.describe_optimized_plan() to see the optimized plan)
CSV SCAN data_sample.csv
PROJECT */4 COLUMNS
이 계획을 실행하고 데이터를 메모리로 로드하려면 collect()
메서드를 사용해야 합니다:
df_lazy = query.collect()
print(df_lazy)
CSV 파일 읽기 이상의 기능: 데이터 조작
CSV 파일 읽기 이외에도, Polars는 pandas 작업과 잘 맞는 포괄적인 데이터 조작 함수를 제공합니다. 이를 통해 Polars는 데이터 분석에 효율적이고 다양한 도구로 사용될 수 있습니다. 데이터 필터링, 변형 적용, 정보 집계 등을 수행하면서 Polars는 우수한 성능으로 모든 작업을 처리할 수 있습니다.
PyGWalker를 사용하여 Polars DataFrame 시각화
PyGWalker (opens in a new tab)는 Polars DataFrame으로부터 데이터 시각화를 쉽게 생성할 수 있는 오픈 소스 Python 라이브러리입니다.
이제 Python 코드로 복잡한 처리를 완료할 필요가 없습니다. 데이터를 가져와 변수를 끌어다 놓기만 하면 다양한 종류의 데이터 시각화를 생성할 수 있습니다! 다음은 PyGWalker 작업에 대한 간단한 데모 비디오입니다:
Jupyter Notebook에서 PyGWalker를 사용하는 방법은 다음과 같습니다:
pip install pygwalker
import pygwalker as pyg
gwalker = pyg.walk(df)
또는 Kaggle Notebook/Google Colab에서 시도해볼 수도 있습니다:
Kaggle Notebook에서 PyGWalker 실행 (opens in a new tab) | Google Colab에서 PyGWalker 실행 (opens in a new tab) | PyGWalker에 ⭐️ 주기 (opens in a new tab) |
---|---|---|
![]() | ![]() | ![]() |
PyGWalker는 오픈 소스 커뮤니티의 지원을 받아 개발되었습니다. PyGWalker GitHub (opens in a new tab)에서 ⭐️을 주시는 것을 잊지 마세요!
자주 묻는 질문:
Polars를 사용하면서 몇 가지 질문이 생길 수 있습니다. 일반적인 질문 몇 가지를 알려드리겠습니다:
- Polars의 read_csv()와 scan_csv() 함수 사이의 주요 차이점은 무엇인가요?
read_csv()
는 간편한 함수로, CSV 파일을 읽고 데이터를 전체적으로 메모리에 로드합니다. 반면 scan_csv()
는 지연 평가(lazy evaluation) 방식으로 작동하여, collect()이 호출될 때까지 데이터를 로드하지 않습니다. 이로 인해 scan_csv()
는 필요한 데이터만 메모리에 로드하여 대용량 데이터셋 작업에 더 효율적입니다.
- Polars는 CSV 파일을 읽을 때 날짜 파싱을 처리할 수 있나요?
네, Polars는 날짜 파싱을 처리할 수 있습니다. read_csv() 함수를 사용할 때 parse_dates=True 인수를 설정하면, Polars가 자동으로 날짜 정보가 포함된 열을 파싱하려고 시도합니다.
- CSV 파일을 읽을 때 특정 열의 데이터 유형을 변경할 수 있나요?
물론 가능합니다. Polars는 CSV 파일을 읽는 동안 열 데이터 유형을 수정할 수 있습니다. with_columns() 메서드와 cast() 함수를 함께 사용하여 이를 수행할 수 있습니다. 예를 들어, df = pl.read_csv('data.csv').with_columns(pl.col('Age').cast(pl.Int32))
는 'Age' 열을 Int32
로 변경합니다.