Polars 열 선택 방법 알아보기

이전 포스팅에서는 Polars 기본 연산에 대해서 알아보았습니다. 이번 포스팅에서는 Polars 열 선택 방법에 대해서 알아보겠습니다. 열 선택 방법에는 크게 표현 확장 방법과 selectors를 사용하는 방법이 있습니다.

예제 데이터프레임 생성

from datetime import date, datetime
import polars as pl

tempData = pl.DataFrame(
    {
        "id": [9, 4, 2],
        "place": ["Mars", "Earth", "Saturn"],
        "date": pl.date_range(date(2022, 1, 1), date(2022, 1, 3), "1d", eager=True),
        "sales": [33.4, 2142134.1, 44.7],
        "has_people": [False, True, False],
        "logged_at": pl.datetime_range(
            datetime(2022, 12, 1), datetime(2022, 12, 1, 0, 0, 2), "1s", eager=True
        ),
    }
).with_row_index("index")

print(tempData)


표현 확장

이전 포스팅에서 살펴본 것처럼 pl.col 메서드를 사용하여 특정 열을 선택할 수 있습니다. 때에 따라서 편의를 위해 그리고 표현식을 확장하기 위해 여러 열을 선택할 수도 있습니다.

여러 열을 지정하는 단일 표현식을 표현식 리스트(데이터프레임 스키마에 따라 다름)으로 확장하여 여러 열을 선택하고 그에 대한 계산을 실행할 수 있습니다.


Select all, or 일부 열을 제외한 모든 열 선택

인수 *를 제공하여 데이터프레임 개체의 모든 열을 선택할 수 있습니다.

out = tempData.select(pl.col("*"))

# 동일한 표현식 
# out = tempData.select(pl.all())

print(out)


모든 열을 포함하고 싶지 않고 일부를 제외하고 선택해야 하는 상황도 있습니다. 이러한 작업도 쉽게 수행할 수 있습니다.

# 일부 열("logged_at", "index")을 제외하고 선택

out = tempData.select(pl.col("*").exclude("logged_at", "index"))
print(out)


여러 문자열 형식으로 열 선택

여러 문자열을 지정하면 표현식이 일치하는 모든 열로 확장할 수 있습니다.

out = tempData.select(pl.col("date", "logged_at").dt.to_string("%Y-%h-%d"))
print(out)


정규 표현식(Regular Expression)으로 열 선택

정규 표현식을 사용하여 여러 열을 선택할 수도 있습니다. 정규 표현식을 ^ 및 $로 묶어 정규 표현식으로 열을 선택하겠다고 pl.col에 알려주면 됩니다.

# 'as' 혹은 'sa' 문자열이 포함된 열 선택하기

out = tempData.select(pl.col("^.*(as|sa).*$"))
print(out)


데이터 유형으로 열 선택

pl.col은 Polars 데이터 유형을 사용하여 여러 열을 선택할 수 있습니다.

out = tempData.select(pl.col(pl.Int64, pl.UInt32, pl.Boolean).n_unique())
print(out)



selectors 사용

Polars에서는 이름, dtype 또는 기타 속성을 기반으로 열 선택을 할 수도 있습니다. 이는 위에 사용된 열에 설명된 기존 함수를 기반으로 구축되었습니다. polars.selectors를 cs로 가져오고 별칭을 지정하여 사용하겠습니다.


데이터 유형을 활용한 열 선택

정수 및 문자열 열만 선택하려면 아래와 같이 수행하면 됩니다.

import polars.selectors as cs

out = tempData.select(cs.integer(), cs.string())
print(out)


집합 연산 적용하여 열 선택

이러한 selector는 set 기반의 열 선택 작업도 가능합니다. 예를 들어 행 번호를 나타내는 첫 번째 열을 제외한 숫자 열을 선택하려면 아래와 같이 수행하면 됩니다.

out = tempData.select(cs.numeric() - cs.first())
print(out)


이름과 숫자가 아닌 열로 행 번호를 선택할 수도 있습니다.

out = tempData.select(cs.by_name("index") | ~cs.numeric())
print(out)


패턴 및 하위 문자열 기준으로 열 선택

selectors는 하위 문자열 및 정규식 패턴과 일치할 수도 있습니다.

out = tempData.select(cs.contains("index"), cs.matches(".*_.*"))
print(out)


표현식으로 변환하여 열 선택

선택한 열에 특정 작업을 적용하려면(즉, 해당 열을 작업할 표현식으로 다시 표현하려면) as_expr을 사용하여 간단히 변환한 다음 정상적으로 진행하면 됩니다.

out = tempData.select(cs.temporal().as_expr().dt.to_string("%Y-%h-%d"))
print(out)


디버깅 Selectors 활용 열 선택

Polars는 또한 Selectors 사용을 돕는 두 가지 유용한 유틸리티 기능인 is_selector 및 Expand_selector를 제공합니다.

from polars.selectors import is_selector

out = cs.temporal()
print(is_selector(out))
--------------------------------------------
True

LazyFrame 객체에 특히 유용한, 선택된 열 이름을 미리 결정하려면 아래와 같이 수행합니다.

from polars.selectors import expand_selector

out = cs.temporal().as_expr().dt.to_string("%Y-%h-%d")
print(expand_selector(tempData, out))
-------------------------------------------------------------
('date', 'logged_at')


결론

이상 Polars 라이브러리의 다양한 열 선택 방법에 대해서 알아보았습니다. 다음 포스팅에서는 Polars 라이브러리의 주요 함수에 대해서 알아보겠습니다.

감사합니다!


답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다