주제
중첩 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
Uploaded by Notion2Tistory v1.1.0