앎을 경계하기

[가짜연구소3기] Data Engineer

[가짜연구소 3기] 데이터 엔지니어링 38 - Working with nested JSONs

양갱맨 2021. 9. 4. 21:13

주제

중첩 JSON 데이터를 다루는 방법에 대해 배웠다.


중첩된 JSON

JSON은 키 : 값 쌍으로 된 데이터 구조를 가지고 있다.

값으로 객체를 가질 수 있기 때문에 JSON은 중첩된 구조를 갖기도 한다.

pandas.io.json 을 사용해서 JSON의 중첩을 다룰 수 있다.

  • json_normalize() : JSON 정규화를 사용하여 중첩된 데이터를 평면화하여 데이터 프레임으로 반환한다.
  • 중첩된 속성 이름은 attribute.nestedattribute로 확인할 수 있다.

예제

import pandas as pd
import requests
from pandas.io.json import json_normalize

#requests.get으로 데이터 가져오기
api_url = 'https://api.yelp.com/v3/businesses/search'
headers = {'Authorization' : 'Bearer {}'.format(api_key)}
params = {'term' : 'bookstore', 'location' : 'San Francisco'}

response = requestss.get(api_url, headers=headers, params=params)
data = response.json()

# 중첩된 데이터 가져오기
bookstores = json_normalize(data['businesses'], sep='_')
print(list(bookstores))

더 깊게 중첩된 데이터 가져오기

  • json_normalize()
    • recored_path : 중첩된 데이터에 대한 문자열 또는 문자열 목록을 사용한다.
    • meta : 결과 데이터 프레임에 포함할 상위 레벨 속성 목록을 가져온다.
    • meta_prefix : 중첩된 json을 평면화하면서 열 이름을 중복되지 않게 하기 위해 메타 접두사를 지정할 수 있다.
df = json_normalize(data['businesses'],
										sep="_",
										record_path='categories',
										meta=['name','alias','rating',
													['coordinates', 'latitude'],
													['coordinates', 'longitude']],
										meta_prefix='biz_')

더 쉬운 이해를 위해 연습문제를 다뤄보자.

# Load json_normalize()
from pandas.io.json import json_normalize

# Isolate the JSON data from the API response
data = response.json()

# Flatten business data into a data frame, replace separator
cafes = json_normalize(data["businesses"],
             sep='_')

# View data
print(cafes.head())
alias                                         categories  coordinates_latitude  coordinates_longitude   display_phone  ...  price rating review_count  transactions  \
0       white-noise-brooklyn-2     [{'alias': 'coffee', 'title': 'Coffee & Tea'}]             40.689358             -73.988415                  ...    NaN    4.5           15            []   
1          devocion-brooklyn-3  [{'alias': 'coffee', 'title': 'Coffee & Tea'},...             40.688570             -73.983340  (718) 285-6180  ...     $$    4.0           73            []   
2   coffee-project-ny-new-york     [{'alias': 'coffee', 'title': 'Coffee & Tea'}]             40.726990             -73.989220  (212) 228-7888  ...     $$    4.5          630            []   
3  spreadhouse-cafe-new-york-3  [{'alias': 'cafes', 'title': 'Cafes'}, {'alias...             40.718910             -73.985850  (646) 524-6353  ...      $    4.0          380            []   
4             usagi-ny-dumbo-7  [{'alias': 'bookstores', 'title': 'Bookstores'...             40.703830             -73.986910  (718) 801-8037  ...     $$    4.5           57            []   

                                                 url  
0  https://www.yelp.com/biz/white-noise-brooklyn-...  
1  https://www.yelp.com/biz/devocion-brooklyn-3?a...  
2  https://www.yelp.com/biz/coffee-project-ny-new...  
3  https://www.yelp.com/biz/spreadhouse-cafe-new-...  
4  https://www.yelp.com/biz/usagi-ny-dumbo-7?adju...  

[5 rows x 24 columns]
# Specify record path to get categories data
flat_cafes = json_normalize(data["businesses"],
                            sep="_",
                    		record_path='categories')

# View the data
print(flat_cafes.head())
alias              title
0            coffee       Coffee & Tea
1            coffee       Coffee & Tea
2  coffeeroasteries  Coffee Roasteries
3             cafes              Cafes
4            coffee       Coffee & Tea
# Load other business attributes and set meta prefix
flat_cafes = json_normalize(data["businesses"],
                            sep="_",
                    		record_path="categories",
                    		meta=['name', 
                                  'alias',  
                                  'rating',
                          		  ['coordinates', 'latitude'], 
                          		  ['coordinates', 'longitude']],
                    		meta_prefix='biz_')





# View the data
print(flat_cafes.head())
alias              title           biz_name                   biz_alias  biz_rating  biz_coordinates_latitude  biz_coordinates_longitude
0            coffee       Coffee & Tea        White Noise      white-noise-brooklyn-2         4.5                 40.689358                 -73.988415
1            coffee       Coffee & Tea           Devocion         devocion-brooklyn-3         4.0                 40.688570                 -73.983340
2  coffeeroasteries  Coffee Roasteries           Devocion         devocion-brooklyn-3         4.0                 40.688570                 -73.983340
3             cafes              Cafes           Devocion         devocion-brooklyn-3         4.0                 40.688570                 -73.983340
4            coffee       Coffee & Tea  Coffee Project NY  coffee-project-ny-new-york         4.5                 40.726990                 -73.989220