일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- 코세라
- Bayesian
- 나의서양미술순례
- mathematicalthinking
- 잠재적결과
- chatGPT
- DataAnalyst
- 독후감
- 베이지안통계
- CausalInference
- 인과추론개요
- 데이터분석가 코딩테스트
- 실무로통하는인과추론
- 벡터
- 데이터분석
- 선형대수학
- 인과추론
- 수학적해석학
- 데이터분석가
- 네카라쿠배당토
- 오블완
- BigQuery
- 인과추론 무작위 실험
- 데이터 분석
- Recsys
- SQL
- recommendation system
- 빅쿼리
- 글또10기
- 티스토리챌린지
- Today
- Total
Derek 의 데이터 분석 성장기
[Json Normalize] Pandas Json 데이터 평면화 본문
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차원 스키마 형태로 변형하고, 데이터 분석을 진행할 수 있다.