이번엔 JSON파일을 데이터 프레임으로 상호 변환하는 방법에 대해 알아보겠습니다.
#전체 코드
import json, pandas as pd
# test.json 내용: [{"name":"Jack","age":26},{"name":"Ace","age":87}]
with open('test.json') as f:
js = json.loads(f.read()) ## json 라이브러리 이용
df = pd.DataFrame(js)
df = pd.read_json('test.json') ## pd.read_json 이용
## orient
df.to_json() # default : orient='columns'
# Output : '{"name":{"0":"Jack","1":"Ace"},"age":{"0":26,"1":87}}'
df.to_json(orient='records')
# Output : '[{"name":"Jack","age":26},{"name":"Ace","age":87}]'
df.to_json(orient='index')
# Output : '{"0":{"name":"Jack","age":26},"1":{"name":"Ace","age":87}}'
## json으로 쓰기
df.to_json('write.json',orient='index')
## -> pd.read_json()으로 json을 읽으면 orient를 자동으로 인식
1. JSON 읽어서 데이터프레임으로 만들기
테스트 JSON파일 test.json을 읽어서 데이터 프레임으로 변환하는 2 가지 방법을 알아보겠습니다. 아래 코드는 라이브러리를 import 하는 것과 test.json의 내용을 주석으로 표시하였습니다.
import pandas as pd
import json
# test.json 내용: [{"name":"Jack","age":26},{"name":"Ace","age":87}]
1) json 라이브러리 사용
with open('test.json') as f:
js = json.loads(f.read())
df = pd.DataFrame(js)
open함수를 통해 test.json을 f로 읽어온 뒤, json.loads() 함수를 이용해 f.read()를 json형태로 변환했습니다. 여기서 f.read()의 내용은 아래와 같습니다.
'[{"name":"Jack","age":26},{"name":"Ace","age":87}]'
* 출력
2)pandas 로만 json 읽기
df = pd.read_json('test.json')
위의 1) 과정을 pandas의 pd.read_json() 함수를 이용하면 간단히 할 수 있습니다. 위 과정과 완전히 동일한 데이터 프레임을 얻을 수 있습니다.
* 출력
2. 데이터프레임을 JSON으로 쓰기
위의 1.에서 생성한 df를 다시 JSON형태로 바꿔 출력 또는 파일로 쓰는 법을 알아보겠습니다.
1) orient
orient란 JSON string의 foramt을 결정하는 방향을 의미합니다. 데이터 프레임을 JSON string으로 쓸 때, orient인자를 통해 형태를 바꿀 수 있습니다. orient는 5가지 종류가 있으며, default는 columns이고, 개인적으로는 records를 주로 사용합니다.
① orient="columns" <default>
df.to_json() # default : orient='columns'
: column이름을 key로 갖으며, 각 value는 { index : value} 형태입니다.
* 출력
② orient="records"
df.to_json(orient='records')
: 한 행에 대해, {columns:value} 형태의 딕셔너리를 요소로 하는 리스트 형태입니다.
* 출력
③ orient="split"
df.to_json(orient='split')
: columns와 index, data를 key로 갖으며, value로는 각 내용을 리스트로 갖는 형태입니다.
* 출력
④ orient="values"
df.to_json(orient='values')
: 테이블에서 값만 리스트형태로 갖습니다.
* 출력
⑤ orient="index"
df.to_json(orient='index')
: 각 index를 키로 갖으며, value로는 {column:value} 형태의 딕셔너리를 갖습니다.
* 출력
2) json으로 쓰기
df.to_json('write.json',orient='records')
df를 write.json으로 쓰는 코드입니다. orient="records"로 했습니다. write.json의 내용은 위의 ②에서 출력된 [{"name":"Jack","age":26},{"name":"Ace","age":87}] 와 동일합니다. 이렇게 쓴 json을 다시 읽을 때는 pd.read_json()으로 읽을 수 있습니다. 이 때, orient가 어떤 종류든 자동 인식됩니다.
읽어주셔서 감사합니다.
오늘도 발전하는 당신을 응원합니다!
다음에 더 유익한 글로 찾아오겠습니다.
* 위의 실습 코드는 아래 링크에 모두 정리되어 있습니다.
Reference)
1. Pandas Image : https://namu.wiki/w/Pandas
2. orient : https://stackoverflow.com/questions/28953012/what-is-the-format-of-the-orient-agument-to-pandas-dataframe-to-json
'Data Science & Analysis > Pandas' 카테고리의 다른 글
[Pandas] 데이터프레임 조건에 따른 행 선택 및 변경 (Select Row with condition) (0) | 2022.07.20 |
---|---|
[Pandas] Dataframe의 행을 반복하는 방법 (iterrows, itertuples, index, loc, iloc) (0) | 2022.07.13 |
[Pandas] 다중 인덱스 엑셀 읽기 및 처리 (Multi Index, Multi Column) (0) | 2020.09.15 |
[Pandas] 리스트(list) 순서로 데이터프레임 정렬 (0) | 2020.09.14 |
[Pandas] Dataframe 비교 - 부분비교와 전체비교 (3) | 2020.08.13 |