Thoughts, stories and ideas.

Pandas 중첩된 JSON 데이터 다루기

데이터 분석을 위해 종종 중첩된 JSON 데이터를 처리하고 분석해야 하는 상황에 직면합니다. Python의 Pandas 라이브러리는 이러한 작업을 용이하게 해주는 json_normalize 함수를 제공합니다. 이 글에서는 **json_normalize**의 기본 원리와 함께, 중첩된 JSON 데이터를 평탄화하고 특정 필드를 추출하여 데이터프레임을 생성하는 과정을 소개합니다.

중첩된 JSON 데이터 예시

다음은 중첩된 JSON 데이터의 예시입니다. 이 데이터에는 배송 정보, 주문자 및 수령자 정보, 주문 항목들이 포함되어 있습니다.

{
  "code": 200,
  "message": "OK",
  "data": [{
    "shipmentBoxId": 6093224066,
    "orderId": 11100031706883,
    "orderedAt": "2024-02-05T00:12:45",
    "orderer": {"name": "바***", "email": "ct*****@na", "safeNumber": ".."},
    ...
    "receiver": {"addr1": "서울시 강남구 ...", "addr2": "102동1...호"},
    "orderItems": [
      {"productId": 698196..., "vendorItemName": "[선물세트] 선물...", ...},
      ...
    ]
  }]
}

json_normalize 함수의 기본 원리

json_normalize 함수는 복잡한 데이터 구조를 가진 JSON 객체를 평면 데이터프레임으로 변환합니다. 이 과정에서 중첩된 객체나 리스트는 별도의 행으로 분리되며, 관련 메타 데이터는 해당 행에 반복적으로 포함됩니다.

범용 함수로 데이터 평탄화 및 필드 선택

다음은 중첩된 JSON 데이터를 평탄화하고, 특정 필드를 선택하여 최종 데이터프레임을 생성하기 위한 범용 함수입니다.

import pandas as pd
from pandas import json_normalize

def flatten_and_select_columns(data, target_arr, record_path=None):

    meta_fields = [[field] if '.' not in field else field.split('.') for field in target_arr if 'orderItems.' not in field]

    # json_normalize를 사용하여 중첩된 JSON 데이터 평탄화
    df = json_normalize(
        data=data['data'],
        record_path=record_path,
        meta=meta_fields,
        errors='ignore'
    )

    final_columns = {field.split(".")[-1]: field for field in target_arr}
    df_final = df.rename(columns=final_columns)[list(final_columns.values())]
    
    return df_final

이 함수는 record_path 매개변수를 통해 중첩된 리스트의 경로를 유연하게 지정할 수 있으며, **target_arr**를 기반으로 필요한 데이터 필드를 선택합니다.

사용 예시

target_arr = ['shipmentBoxId', 'orderedAt', 'orderer.name', 'receiver.addr1', 'receiver.addr2', 'orderItems.productId', 'orderItems.vendorItemName']
flatten_df = flatten_and_select_columns(res_data, target_arr, 'orderItems')
flatten_df

위 코드를 실행하면, 중첩된 JSON 데이터가 평탄화되어 주어진 필드들을 포함하는 데이터프레임이 생성됩니다.

결론

Pandas의 json_normalize 함수를 사용하여 중첩된 JSON 데이터를 효과적으로 처리할 수 있습니다. 이를 통해 데이터 분석 작업의 효율성과 정확성을 높일 수 있습니다.