Skip to content

Polars JSON 데이터 처리 방법: 빠른 가이드

Updated on

JSON 데이터를 전문가처럼 처리하는 꿈이 있나요? 환영합니다! 오늘은 Python 및 Rust에서 슈퍼차지된 DataFrame 라이브러리인 Polars를 살펴봅니다. JSON 데이터 처리에 중점을 두고 살펴보겠습니다. 빠른 성능과 쉬운 사용법으로 인해 Polars가 전 세계의 데이터 과학자들이 선택하는 대표적인 라이브러리로 등극할 것입니다.

Polars에서 JSON 문자열 컬럼을 Dict로 변환하기

DataFrame에서 종종 JSON 문자열이 포함된 컬럼을 만날 수 있습니다. 이 컬럼을 JSON 문자열 내에 포함된 특정 키 또는 값에 따라 필터링하려면, JSON 문자열을 딕셔너리로 변환하는 것이 가장 견고한 방법입니다. 그러나 Polars는 일반적인 딕셔너리를 사용하지 않습니다. 대신, 각 딕셔너리 키는 struct '필드 이름'에 매핑되며, 해당 딕셔너리 값은 해당 필드의 값이 됩니다.

다음과 같은 사항을 고려해야 합니다.

  1. 모든 struct는 같은 필드 이름을 가져야 합니다.
  2. 필드 이름은 동일한 순서로 나열되어야 합니다.

하지만 걱정하지 마세요! Polars는 json_path_match이라는 함수를 제공합니다. 이 함수는 JSONPath 구문을 기반으로 값을 추출합니다. 이 함수를 사용하면 키가 존재하는지 확인하고 값을 검색할 수 있습니다. 그릇된 예시를 보여드리겠습니다.

import polars as pl
 
json_list = [
    """{"name": "Maria", "position": "developer", "office": "Seattle"}""",
    """{"name": "Josh", "position": "analyst", "termination_date": "2020-01-01"}""",
    """{"name": "Jorge", "position": "architect", "office": "", "manager_st_dt": "2020-01-01"}""",
]
 
df = pl.DataFrame(
    {
        "tags": json_list,
    }
).with_row_count("id", 1)
 
df = df.with_columns([
    pl.col('tags').str.json_path_match(r"$.name").alias('name'),
    pl.col('tags').str.json_path_match(r"$.office").alias('location'),
    pl.col('tags').str.json_path_match(r"$.manager_st_dt").alias('manager start date'),
])

위의 예시에서 'tags'라는 컬럼이 포함된 DataFrame을 만들었습니다. 이후 json_path_match 함수를 사용하여 specifice 값을 추출합니다. 그런 다음 이 값들은 새로운 컬럼 ('name', 'location', 'manager start date')에 할당됩니다.

키가 발견되지 않으면 json_path_match은 null을 반환합니다. 이 사실을 활용하여 특정 키의 존재에 따라 DataFrame을 필터링할 수 있습니다.

df = df.filter(pl.col('tags').str.json_path_match(r"$.manager_st_dt").is_not_null())

위 코드 라인에서는 JSON 문자열에서 'manager_st_dt' 키가 존재하는 행만 포함하는 DataFrame으로 필터링합니다.

큰 JSON 파일을 Polars DataFrame으로 읽어들이기

JSON 파일을 처리할 때 대형 JSON 파일로 작업할 경우, 다음과 같은 오류가 발생할 수 있습니다: "RuntimeError: BindingsError: "ComputeError(Owned("InvalidEOF"))". 이 오류의 원인은 여러 가지가 있을 수 있지만, 흔한 원인 중 하나는 Polars가 JSON 파일의 첫 1000행에서 스키마를 유추하고 파일의 나머지 부분에서 다른 스키마에 직면할 때 발생합니다. 일반적으로 일부 항목이 초기 1000행에 없었던 추가 키를 가지고 있기 때문입니다.

이러한 상황을 처리하기 위해, Polars에 파일을 읽을 때 특정한 스키마를 사용하도록 지시하거나, Polars가 스키마를 유추할 때 전체 파일을 스캔하도록 강제할 수 있습니다. 후자의 경우, 특히 큰 파일의 경우 시간이 더 걸리지만, "InvalidEOF" 오류를 방지할 수 있습니다.

df = pl.read_json("large_file.json", infer_schema_length=None)

infer_schema_lengthNone으로 설정하여 Polars가 스키마를 유추할 때 전체 파일을 스캔하도록합니다. 이 작업은 더 많은 시간이 소요될 수 있지만, Polars가 파일의 전체 스키마를 정확하게 인식하도록하므로 오류 가능성을 제거합니다.

이러한 기술을 사용하여 Polars에서 JSON 데이터 처리 작업을 효과적으로 처리할 수 있으며, JSON 문자열을 변환하여 대형 JSON 파일을 처리할 수 있습니다. Polars는 효율적인 데이터 처리의 새로운 가능성을 엽니다.

PyGWalker를 사용하여 Polars 데이터 프레임 시각화

PyGWalker (opens in a new tab)는 Polars 데이터 프레임에서 쉽게 데이터 시각화를 생성할 수 있는 오픈 소스 파이썬 라이브러리입니다.

PyGWalker for Data visualization (opens in a new tab)

이제 더 이상 복잡한 Python 코딩으로 처리해야 할 필요가 없습니다. 데이터를 가져오고, 변수를 끌어다 놓아서 모든 종류의 데이터 시각화를 만들 수 있습니다! 운영에 대한 간단한 데모 비디오는 다음과 같습니다.


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)
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에서 JSON 데이터를 처리하는 데 관련된 일반적인 질문은 다음과 같습니다.

Q: Polars에서 왜 JSON 문자열을 dict로 변환해야 하나요?
A: Polars는 직접 Python 딕셔너리로 작동하지 않습니다. 대신 'structs' 개념을 사용합니다. JSON 문자열을 structs로 변환하면 이러한 JSON 문자열 내에서 특정한 키 또는 값에 기반한 작업을 수행할 수 있습니다.

Q: 'read_json' 함수에서 'infer_schema_length' 매개 변수는 무엇을 하는가요?
A: 'infer_schema_length' 매개 변수는 Polars가 스키마를 추론하기 위해 JSON 파일의 처음 몇 줄을 스캔해야 하는지를 정의합니다. None으로 설정하면 Polars가 파일 전체를 스캔하므로 전체 스키마를 종합적으로 이해하면서 더 긴 로딩 시간이 소요됩니다.

Q: 'json_path_match' 함수를 사용할 때 키를 찾을 수 없으면 어떻게 됩니까?
A: 'json_path_match' 함수가 키를 찾지 못하면 null을 반환합니다. 이 동작은 특정 키의 존재 또는 부재에 따라 데이터를 필터링하는 데 사용할 수 있습니다.