정보/Python

[Python] json 형식을 데이터프레임으로 변환하기

나서뿌 2023. 5. 11. 03:57

오늘은 json형식을 데이터프레임으로 쉽게 바꾸는 방법에 대해 고민한 과정에 대해 정리해보려고 합니다.

 

제가 사용한 던전앤파이터 API를 예시로 글을 한 번 작성해보도록 하겠습니다.

from urllib.request import urlopen

# API key 지정
key = "API_KEY"

url = f'https://api.neople.co.kr/df/servers?apikey={key}'
result = urlopen(url)
result_html = result.read()
result_html

출력 결과

먼저 urlopen() 함수를 사용하여 HTTP 요청을 보냅니다. 이 함수는 해당 URL에 대한 응답을 반환합니다.

 

result 변수에 저장된 응답을 read() 메서드를 사용하여 바이트 형식으로 읽어들입니다.

import json

result_json = json.loads(result_html)
print(json.dumps(result_json, indent=4))

출력 결과

json.loads() 함수를 사용하여 바이트 형식의 응답을 JSON 형식으로 변환합니다. json.dumps() 함수를 사용하면 json을 보기 좋은 형식으로 출력할 수 있습니다. 이때, indent 매개변수를 사용하여 들여쓰기를 설정합니다.

 

여기서 저는 result_json의 serverId와 serverName을 데이터프레임으로 변환하고자 하였습니다. 반복문을 사용하는 방법이 있었지만 조금 더 간단한 방법을 찾아보았습니다.

 

<첫 번째 시도 : map과 lambda 활용>

import pandas as pd

server_ids = list(map(lambda item: item['serverId'], result_json['rows']))
server_names = list(map(lambda item: item['serverName'], result_json['rows']))

server_df = pd.DataFrame({'serverId' : server_ids,
                         'serverName' : server_names})
server_df

출력 결과

result_json에서 서버 ID와 서버 이름을 추출하기 위해 map() 함수와 람다 함수를 사용하였습니다. 각 요소에서 serverId와 serverName 키의 값을 추출한 후, 데이터프레임으로 변환하였습니다.

<두 번째 시도 : json_normalize>

이 과정을 조금 더 간단하게 하는 방법이 없는지 ChatGPT에게 물어보았습니다. ChatGPT가 Pandas의 json_normalize() 함수를 사용하라고 조언하였습니다.

df_server = pd.json_normalize(result_json['rows'])
df_server

출력 결과

pd.json_normalize() 함수를 사용하여 JSON 데이터를 정규화(normalize)하여 데이터프레임으로 변환합니다. 정규화는 중첩된 JSON 구조를 평면화하여 표 형태의 데이터로 변환하는 작업을 수행합니다.


오늘은 json을 데이터프레임으로 변환하는 방법에 대해 알아보았습니다. GPT 덕분에 코딩 공부가 한결 쉬워졌습니다. json_normalize를 주로 사용하겠지만, map과 lambda를 사용하여 반복문을 대신하는 방법도 알아둘 필요가 있을 것 같습니다.

 

그럼 이만 오늘은 글 여기서 마치도록 하겠습니다. 읽어주셔서 감사합니다 :)