Polars JSON 데이터 처리 방법: 빠른 가이드
Updated on
JSON 데이터를 전문가처럼 처리하는 꿈이 있나요? 환영합니다! 오늘은 Python 및 Rust에서 슈퍼차지된 DataFrame 라이브러리인 Polars를 살펴봅니다. JSON 데이터 처리에 중점을 두고 살펴보겠습니다. 빠른 성능과 쉬운 사용법으로 인해 Polars가 전 세계의 데이터 과학자들이 선택하는 대표적인 라이브러리로 등극할 것입니다.
Polars에서 JSON 문자열 컬럼을 Dict로 변환하기
DataFrame에서 종종 JSON 문자열이 포함된 컬럼을 만날 수 있습니다. 이 컬럼을 JSON 문자열 내에 포함된 특정 키 또는 값에 따라 필터링하려면, JSON 문자열을 딕셔너리로 변환하는 것이 가장 견고한 방법입니다. 그러나 Polars는 일반적인 딕셔너리를 사용하지 않습니다. 대신, 각 딕셔너리 키는 struct '필드 이름'에 매핑되며, 해당 딕셔너리 값은 해당 필드의 값이 됩니다.
다음과 같은 사항을 고려해야 합니다.
- 모든 struct는 같은 필드 이름을 가져야 합니다.
- 필드 이름은 동일한 순서로 나열되어야 합니다.
하지만 걱정하지 마세요! 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_length
를 None
으로 설정하여 Polars가 스키마를 유추할 때 전체 파일을 스캔하도록합니다. 이 작업은 더 많은 시간이 소요될 수 있지만, Polars가 파일의 전체 스키마를 정확하게 인식하도록하므로 오류 가능성을 제거합니다.
이러한 기술을 사용하여 Polars에서 JSON 데이터 처리 작업을 효과적으로 처리할 수 있으며, JSON 문자열을 변환하여 대형 JSON 파일을 처리할 수 있습니다. Polars는 효율적인 데이터 처리의 새로운 가능성을 엽니다.
PyGWalker를 사용하여 Polars 데이터 프레임 시각화
PyGWalker (opens in a new tab)는 Polars 데이터 프레임에서 쉽게 데이터 시각화를 생성할 수 있는 오픈 소스 파이썬 라이브러리입니다.
이제 더 이상 복잡한 Python 코딩으로 처리해야 할 필요가 없습니다. 데이터를 가져오고, 변수를 끌어다 놓아서 모든 종류의 데이터 시각화를 만들 수 있습니다! 운영에 대한 간단한 데모 비디오는 다음과 같습니다.
Jupyter Notebook에서 PyGWalker를 사용하는 방법은 다음과 같습니다.
pip install pygwalker
import pygwalker as pyg
gwalker = pyg.walk(df)
대신 Kaggle Notebook/Google Colab에서도 시도해볼 수 있습니다.
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을 반환합니다. 이 동작은 특정 키의 존재 또는 부재에 따라 데이터를 필터링하는 데 사용할 수 있습니다.