JSON 기본 이해
JSON(JavaScript Object Notation)은 XML과 유사하게 텍스트 정보를 저장하고 교환하는 구문입니다. JSON은 XML보다 더 작고 빠르며, 파싱하기 쉽습니다. Pandas는 이러한 JSON 데이터를 효과적으로 다룰 수 있습니다.
[
{
"번호": "J001",
"이름": "네이버",
"url": "www.naver.com",
"조회수": 85
},
{
"번호": "J002",
"이름": "야후",
"url": "www.yahoo.com",
"조회수": 73
}
]
Pandas의 to_string() 메서드로 JSON 문자열을 출력할 수 있습니다.
import pandas as pd
데이터프레임 = pd.read_json('사이트들.json')
print(데이터프레임.to_string())
또한 직접 딕셔너리를 DataFrame으로 변환할 수도 있습니다.
import pandas as pd
자료 = [
{
"번호": "J001",
"이름": "네이버",
"url": "www.naver.com",
"조회수": 85
},
{
"번호": "J002",
"이름": "야후",
"url": "www.yahoo.com",
"조회수": 73
}
]
데이터프레임 = pd.DataFrame(자료)
print(데이터프레임)
Python 딕셔너리에서 DataFrame 생성
JSON 객체는 Python 딕셔너리와 같은 형식을 가집니다.
import pandas as pd
# 딕셔너리 형태의 JSON
s = {
"열1":{"행1":1,"행2":2,"행3":3},
"열2":{"행1":"x","행2":"y","행3":"z"}
}
# JSON을 DataFrame으로 변환
데이터프레임 = pd.DataFrame(s)
print(데이터프레임)
중첩된 JSON 데이터 처리
다음은 학생 정보를 포함하는 중첩된 JSON 파일 예시입니다.
{
"학교명": "ABC 초등학교",
"학년": "1학년",
"학생들": [
{
"번호": "S001",
"이름": "톰",
"수학": 60,
"물리": 66,
"화학": 61
},
{
"번호": "S002",
"이름": "제임스",
"수학": 89,
"물리": 76,
"화학": 51
}]
}
import pandas as pd
데이터프레임 = pd.read_json('중첩_리스트.json')
print(데이터프레임)
중첩된 데이터의 완전한 분석
json_normalize() 함수를 사용하면 중첩된 JSON 데이터를 쉽게 분석할 수 있습니다.
import pandas as pd
import json
with open('중첩_리스트.json','r') as f:
자료 = json.loads(f.read())
분석된_데이터프레임 = pd.json_normalize(자료, record_path =['학생들'])
print(분석된_데이터프레임)
메타데이터 표시
메타데이터를 함께 표시하려면 meta 매개변수를 사용합니다.
import pandas as pd
import json
with open('중첩_리스트.json','r') as f:
자료 = json.loads(f.read())
분석된_데이터프레임 = pd.json_normalize(
자료,
record_path =['학생들'],
meta=['학교명', '학년']
)
print(분석된_데이터프레임)
복잡한 중첩 구조 처리
복잡한 중첩 구조를 가진 JSON 데이터도 Pandas로 처리 가능합니다.
{
"학교명": "로컬 초등학교",
"학년": "1학년",
"정보": {
"교장": "John Smith",
"주소": "XYZ road, London, UK",
"연락처": {
"이메일": "admin@e.com",
"전화": "123456789"
}
},
"학생들": [
{
"번호": "S001",
"이름": "톰",
"수학": 60,
"물리": 66,
"화학": 61
}]
}
glom 모듈을 이용한 깊게 중첩된 데이터 접근
glom 모듈을 통해 깊게 중첩된 데이터에 접근할 수 있습니다.
!pip install glom
import pandas as pd
from glom import glom
데이터프레임 = pd.read_json('깊게_중첩.json')
자료 = 데이터프레임['학생들'].apply(lambda 행: glom(행, '성적.수학'))
print(자료)