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