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 데이터를 효과적으로 처리할 수 있습니다. 이를 통해 데이터 분석 작업의 효율성과 정확성을 높일 수 있습니다.

Subscribe to Keun's Story newsletter and stay updated.

Don't miss anything. Get all the latest posts delivered straight to your inbox. It's free!
Great! Check your inbox and click the link to confirm your subscription.
Error! Please enter a valid email address!