- [Python] Polars의 데이터 타입과 구조2025년 04월 10일
- 홀쑥
- 작성자
- 2025.04.10.:17
Polars에서 Data Type과 Structure
데이터 타입
Polars는 다양한 데이터 타입을 지원하며 모든 결측값을 NaN이 아닌 null로 표현한다.
숫자 데이터 타입
- Signed Integers(부호가 있는 정수)
- Int8, -128~127
- Int16, -32768 ~ 32767
- Int32, -2147483648 ~ 2147483647
- Int64, -9223372036854775808 ~ 9223372036854775807
- Unsigned Integers(부호가 없는 정수)
- UInt8, 0 ~ 255
- UInt16, 0 ~ 65535
- UInt32, 0 ~ 4264967295
- UInt64, 0 ~ 18446744073709551615
- Floating point numbers(부동소수점)
- Float32, 단정밀도
- Float64, 배정밀도
- decimals
- 선택적 정밀도와 음수가 아닌 값을 표현하는 128-bit의 10진수로 Python의 decimal과 같음
중첩 데이터 타입
- List
- 모든 요소의 데이터 타입이 같고 가변 길이의 1차원 리스트
- Struct
- Python의 Dictionary나 typing.TypedDict와 비슷하게 한 열에 여러 필드를 저장
- Array
- 고정된 길이를 가진, Numpy 배열과 유사한 배열
시간에 관련된 데이터 타입
- Date
- 날짜를 표현
- Datetime
- 날짜와 시간을 표현
- Time
- 시간을 표현
- Duration
- 기간을 표현
기타
- String
- 가변길이의 UTF-8 인코딩 된 문자열 데이터
- Binary
- 임의의 다양한 길이의 원시 바이너리 데이터
- Boolean
- boolean 타입
- Categorical
- 런타임에서 추론되는 문자열 분류들의 효율적이게 인코딩
- Enum
- 미리 정해진 문자열 분류 집합을 효율적이고 순서 있게 인코딩
- Object
- 임의의 Python 객체
구조체
Series
Series는 모두 같은 데이터타입을 가진 1차원의 데이터 구조로 Polars는 값으로부터 데이터타입을 추론한다.
특별한 데이터타입을 지정하는 것도 가능하다.
import polars as pl s = pl.Series("ints", [1, 2, 3, 4, 5]) print(s)
print한 Series # dtype으로 데이터타입 선언 s1 = pl.Series("ints", [1, 2, 3, 4, 5]) s2 = pl.Series("uints", [1, 2, 3, 4, 5], dtype=pl.UInt64) print(s1.dtype, s2.dtype)
dtype을 지정한 Series는 UInt로 변경 DataFrame
DataFrame은 고유한 이름을 가진 Series들이 포함된 데이터타입의 2차원 데이터구조이다.
데이터를 DataFrame에 보관하면 Polars API를 사용하여 데이터를 조작하는 쿼리를 작성할 수 있다.
Series와 같이 DataFrame을 만들 때 Schema를 추론하고, 필요하다면 덮어쓸 수 있다.
from datetime import date df = pl.DataFrame( { "name": ["Alice Archer", "Ben Brown", "Chloe Cooper", "Daniel Donovan"], "birthdate": [ date(1997, 1, 10), date(1985, 2, 15), date(1983, 3, 22), date(1981, 4, 30), ], "weight": [57.9, 72.5, 53.6, 83.1], # (kg) "height": [1.56, 1.77, 1.65, 1.75], # (m) } ) print(df)
Schema
Schema는 Column 또는 Series의 이름과 그 컬럼의 데이터 타입의 매핑 정보이다.
print(df.schema)
출력값 Python에선 Dictionary를 사용하여 컬럼명과 데이터타입을 정의할 수 있는데 schema 파라미터 사용 시 모든 컬럼을 입력해줘야 한다. 이때 데이터 타입에 None을 입력하면 해당 컬럼은 덮어쓰지 않는다.
df = pl.DataFrame( { "name": ["Alice", "Ben", "Chloe", "Daniel"], "age": [27, 39, 41, 43], }, schema={"name": None, "age": pl.UInt8}, ) print(df)
name은 덮어쓰지 않은 경우 모든 스키마를 지정하지 않으면 다음과 같은 에러가 발생 모든 컬럼을 override 해야 하는 불편함이 있어 특정 컬럼의 schema만 변경할 땐 schema_overrides 파라미터에 원하는 컬럼과 데이터타입만을 매핑하여 사용하는 것이 편하다.
df = pl.DataFrame( { "name": ["Alice", "Ben", "Chloe", "Daniel"], "age": [27, 39, 41, 43], }, schema_overrides={"age": pl.UInt8}, ) print(df)
schema 파라미터와 달리 ValueError가 발생하지 않음 DataFrame 확인
DataFrame을 빠르게 확인하기 위해 pandas와 비슷하게 몇 가지 함수를 지원한다.
- head
- DataFrame.head(n)
- 인자로 입력한 개수만큼 상위 N개의 row를 출력하며, default는 5개이다.
- tail
- DataFrame.tail(n)
- 인자로 입력한 개수만큼 하위 N개의 row를 출력하며, default는 5개이다.
- glimpse
- DataFrame.glimpse(...)
- 조금 다른 함수로, 각 컬럼 별 처음 몇 로우를 보여주지만 head와 포맷이 다르다.
- 한 컬럼당 한 열씩 사용하며 컬럼당 N개의 로우 출력, defaulit는 10개이다.
- return_as_string을 True로 준다면 stdout 대신 string으로 반환한다.
- sample
- DataFrame.sample(n, ...)
- 말 그대로 무작위 샘플 데이터 추출이다.
- seed 파라미터를 통해 무작위가 아닌 일정 샘플 추출이 가능하다.
- describe
- DataFrame.describe(...)
- 모든 컬럼에 대한 요약 통계를 볼 수 있다.
from datetime import date df = pl.DataFrame( { "name": ["Alice Archer", "Ben Brown", "Chloe Cooper", "Daniel Donovan"], "birthdate": [ date(1997, 1, 10), date(1985, 2, 15), date(1983, 3, 22), date(1981, 4, 30), ], "weight": [57.9, 72.5, 53.6, 83.1], # (kg) "height": [1.56, 1.77, 1.65, 1.75], # (m) } ) print(df.head(3)) print(df.tail(3)) print(df.glimpse(return_as_string=True)) print(df.glimpse()) print(df.sample(2, seed=42)) print(df.sample(2)) print(df.describe())
head tail sample, seed가 없다면 매번 다른 데이터가 나온다. glimpse glimpse(string 반환) describe 마무리
이번엔 Polars의 데이터 타입 및 구조체들, 간단히 DataFrame을 확인하는 방법에 대해 알아보았다.
다음번엔 Polars의 표현식과 Context에 대해 알아보겠다.
참고자료
'Language > Python' 카테고리의 다른 글
[Python] Polars Lazy API로 효율적인 데이터 처리 (0) 2025.04.21 [Python] Polars, 빠른 속도와 낮은 메모리의 DataFrame 라이브러리 (1) 2025.04.04 [Python] JSON 직렬화와 역직렬화(json, ujson, orjson, msgspec) (0) 2025.03.22 [Python] Python 3.11 cchardet fatal error: longintrepr.h: No such file or directory (0) 2025.03.12 Rocky Linux에 pyenv 설치 (0) 2024.12.02 다음글이전글이전 글이 없습니다.댓글