Derek 의 데이터 분석 성장기

[Json Normalize] Pandas Json 데이터 평면화 본문

Programming/코드

[Json Normalize] Pandas Json 데이터 평면화

Derek Grey 2024. 3. 29. 21:44
반응형

 

 

1. Json Normalize

 

ROW 값 안에 기록된 Json 타입의 데이터를 평면화 하는 함수. Pandas 의 내장 함수중에서는 제이슨 구조로 된 데이터를 평면화 시키는 함수가 있다.

 

 

pandas.json_normalize(data, record_path=None, meta=None, meta_prefix=None, record_prefix=None, errors='raise', sep='.', max_level=None)

 

 

위와 같은 형식으로 코드를 활용할 수 있다.

 

코드설명은 공식문서에서도 참고할 수 있으니, 실 사용예시는 어떻게 활용될지 얘기해보자. 예를 들어 NoSQL(MongoDB) 데이터를 분석해야 한다. 예를 들어, 우리 서비스 유저들이 특정 키워드로 검색, 필터를 걸어 검색서비스를 이용하고 있다고 해보자. NoSQL에는 RDBMS 처럼 Scheme 로 구조화되어 있지 않기 때문에, Json 형태로 데이터가 다큐먼트안에 적재된다.

 이와 같이, 구조화 되지 않은 형태의 Json 데이터를 RDBMS 이나 DataFrame 형태로 빠르게 평면화하고 분석할 때 사용할 수 있는 함수이다.

 

1. 일차적으론, DF를 조회해서 Json 형태로 실제로 검색이 되고 있는지를 확인해야 한다. 그리고, Json 의 Value 안에 Key Value가 또 열리는 { Key : Value : { key : value } } 형태의 2중 Json 형태들도 존재하는지를 확인해야한다.

 

# 칼럼 값들을 하나하나 조회해볼 수 있는 코드

# for idx, row in df.iterrows() : 
#     json_data = row['filter']
#     for key, value in json_data.items() : 
#         print(f"ROW {idx + 1} : key : {key}, Value : {value}")

#gte : greater than
#lte : limited

 

  • 설명 : DF 안에 rows 등을 iterrows 로 결과를 풀어줌. 그리고 그 안에 2중 Key Value로 묶여있는 값들이 존재하는지를 확인해야 한다. 만약, 네이버 쇼핑 검색 서비스라고 치면 키워드 검색을 활용 할 때, 특정 가격대를 필터로 적용할 수도 있고, 특정 상의 등 카테고리를 지정해서 검색하고 있을수도 있다. 그런 데이터가 몽고 DB 안에 적재되고, 우리는 해당 Json 파일을 Python 의 Pandas에서 1차원적으로 분석할 수 있는 것이다.

 

가격대의 범위가 걸리는 것을 알 수 있다.

 

 

2. 두번째 스텝으로는 Json Normalize를 진행해줘야 한다. 평면화 시키고 싶은(Json Type을 Unnest) 할 칼럼을 지정하고, 아래 코드와 같이 평면화를 진행해준다. 해당과 같이 평면화를 하게되면 json 타입의 데이터가 칼럼의 열로 지정된다.

#1. 평면화 하고 싶은 칼럼을 조회함. 
json_cols = ['checkin', 'checkout', 'createdAt'] # 3가지 칼럼을 평면화하고 싶음.


#2. json_normalize 를 활용한 평면화
pd.concat([json_normalize(df[col]).add_prefix(f"{col}_") for col in json_cols], axis=1)

 

 

3. 그러나, 평면화가 필요없는 일반적인 칼럼도 존재한다. 예를 들어보면 User id 같은 값은 고유값이기 때문에 Json 데이터로서도 평면화가 필요없다. 평면화가 필요한 칼럼은 json_normalize, 그리고 그 외 칼럼은 따로 DF를 저장하고 병합과 드랍을 조합하여 DF를 조작하면 쉽게 문제를 해결할 수 있다.

 

# JSON 열 평면화
else_columns = ['_id', 'numberOfGuest', 'filter',]  # JSON 열 리스트
df_json_else_columns = pd.concat([json_normalize(df[col]) for col in else_columns], axis=1)
# JSON이 아닌 열과 JSON 열을 결합
df_cleaned = pd.concat([df_json, df_json_else_columns, df.drop(columns = else_columns + json_cols)], axis=1)

 

 

4. 결과

이를 통해, NoSQL 혹은 Json 으로 저장되는 데이터들을 평면화 할 수 있다. 궁극적으로, Json Normalize 메소드는 칼럼안에 Json 형태로 중첩되어 진 Semi-Structurd Json 타입의 데이터를 우리가 일반적으로 분석하는 RDBMS 의 1차원 스키마 형태로 변형하고, 데이터 분석을 진행할 수 있다.

반응형