개요
2022.12.15 - [Python] Pandas - 데이터 입출력(CSV)에 이어서 JSON 데이터를 읽고 쓰는 방법을 정리한다.
JSON 데이터 읽기
pandas.read_json 함수를 이용해 JSON 파일 또는 JSON 문자열로부터 데이터를 읽어 들일 수 있다.
JSON 문자열 읽기
json_str = """{
"votes": {
"funny": 2,
"useful": 5,
"cool": 1
},
"user_id": "harveydennis",
"name": "Jasmine Graham",
"url": "http://example.org/user_details?userid=harveydennis",
"average_stars": 3.5,
"review_count": 12,
"type": "user"
}"""
pd.read_json(json_str)
JSON 파일 읽기
json_file_path = 'D:\PycharmProjects\\flask_api\\test2.json'
pd.read_json(json_file_path)
JSON 파일 쓰기
pandas.to_json 함수를 이용해 DataFrame을 JSON 문자열로 만들거나 파일로 쓸 수 있다.
JSON 문자열로 변환
json_file_path = 'D:\PycharmProjects\\flask_api\\test2.json'
df = pd.read_json(json_file_path)
df.to_json()
# 실행 결과
'{
"votes": {
"cool": 2,
"funny": 1,
"useful": 8
},
"user_id": {
"cool": "rodriguezdennis",
"funny": "rodriguezdennis",
"useful": "rodriguezdennis"
},
"name": {
"cool": "Jennifer Roach",
"funny": "Jennifer Roach",
"useful": "Jennifer Roach"
},
"url": {
"cool": "http:\\/\\/www.example.com\\/user_details?userid=rodriguezdennis",
"funny": "http:\\/\\/www.example.com\\/user_details?userid=rodriguezdennis",
"useful": "http:\\/\\/www.example.com\\/user_details?userid=rodriguezdennis"
},
"average_stars": {
"cool": 3.5,
"funny": 3.5,
"useful": 3.5
},
"review_count": {
"cool": 12,
"funny": 12,
"useful": 12
},
"type": {
"cool": "user",
"funny": "user",
"useful": "user"
}
}'
Orient
매개변수로 JSON 문자열의 형식을 결정하는 orient를 지정할 수 있다. orient는 split, records, index, columns, values, table로 지정할 수 있으며, 각 값에 따른 형식은 다음과 같다.
1. columns
column을 키로 {index: value}를 값으로 한다. 기본값이다.
2. split
index 키에 index 리스트, columns 키에 columns 리스트, data 키에 값 리스트가 저장되는 형식이다.
df.to_json(orient='split')
# 실행 결과
{
"columns": [
"votes",
"user_id",
"name",
"url",
"average_stars",
"review_count",
"type"
],
"index": [
"cool",
"funny",
"useful"
],
"data": [
[
2,
"rodriguezdennis",
"Jennifer Roach",
"http:\\/\\/www.example.com\\/user_details?userid=rodriguezdennis",
3.5,
12,
"user"
],
[
1,
"rodriguezdennis",
"Jennifer Roach",
"http:\\/\\/www.example.com\\/user_details?userid=rodriguezdennis",
3.5,
12,
"user"
],
[
8,
"rodriguezdennis",
"Jennifer Roach",
"http:\\/\\/www.example.com\\/user_details?userid=rodriguezdennis",
3.5,
12,
"user"
]
]
}
3. records
{column: value}를 원소로 하는 리스트로 저장된다. 가장 많이 사용하는 방식이다.
df.to_json(orient='records')
# 실행 결과
[
{
"votes": 2,
"user_id": "rodriguezdennis",
"name": "Jennifer Roach",
"url": "http:\\/\\/www.example.com\\/user_details?userid=rodriguezdennis",
"average_stars": 3.5,
"review_count": 12,
"type": "user"
},
{
"votes": 1,
"user_id": "rodriguezdennis",
"name": "Jennifer Roach",
"url": "http:\\/\\/www.example.com\\/user_details?userid=rodriguezdennis",
"average_stars": 3.5,
"review_count": 12,
"type": "user"
},
{
"votes": 8,
"user_id": "rodriguezdennis",
"name": "Jennifer Roach",
"url": "http:\\/\\/www.example.com\\/user_details?userid=rodriguezdennis",
"average_stars": 3.5,
"review_count": 12,
"type": "user"
}
]
4. index
index를 키로, {column: value}를 값으로 한다.
df.to_json(orient='index')
# 실행 결과
{
"cool": {
"votes": 2,
"user_id": "rodriguezdennis",
"name": "Jennifer Roach",
"url": "http:\\/\\/www.example.com\\/user_details?userid=rodriguezdennis",
"average_stars": 3.5,
"review_count": 12,
"type": "user"
},
"funny": {
"votes": 1,
"user_id": "rodriguezdennis",
"name": "Jennifer Roach",
"url": "http:\\/\\/www.example.com\\/user_details?userid=rodriguezdennis",
"average_stars": 3.5,
"review_count": 12,
"type": "user"
},
"useful": {
"votes": 8,
"user_id": "rodriguezdennis",
"name": "Jennifer Roach",
"url": "http:\\/\\/www.example.com\\/user_details?userid=rodriguezdennis",
"average_stars": 3.5,
"review_count": 12,
"type": "user"
}
}
5. values
값만 리스트 형식으로 저장한다.
df.to_json(orient='values')
# 실행 결과
[
[
2,
"rodriguezdennis",
"Jennifer Roach",
"http:\\/\\/www.example.com\\/user_details?userid=rodriguezdennis",
3.5,
12,
"user"
],
[
1,
"rodriguezdennis",
"Jennifer Roach",
"http:\\/\\/www.example.com\\/user_details?userid=rodriguezdennis",
3.5,
12,
"user"
],
[
8,
"rodriguezdennis",
"Jennifer Roach",
"http:\\/\\/www.example.com\\/user_details?userid=rodriguezdennis",
3.5,
12,
"user"
]
]
6. table
schema 키에 index와 columns의 이름과 데이터 형식이, data 키에 데이터 값이 저장되는 형식이다.
df.to_json(orient='table')
# 실행 결과
{
"schema": {
"fields": [
{
"name": "index",
"type": "string"
},
{
"name": "votes",
"type": "integer"
},
{
"name": "user_id",
"type": "string"
},
{
"name": "name",
"type": "string"
},
{
"name": "url",
"type": "string"
},
{
"name": "average_stars",
"type": "number"
},
{
"name": "review_count",
"type": "integer"
},
{
"name": "type",
"type": "string"
}
],
"primaryKey": [
"index"
],
"pandas_version": "1.4.0"
},
"data": [
{
"index": "cool",
"votes": 2,
"user_id": "rodriguezdennis",
"name": "Jennifer Roach",
"url": "http:\\/\\/www.example.com\\/user_details?userid=rodriguezdennis",
"average_stars": 3.5,
"review_count": 12,
"type": "user"
},
{
"index": "funny",
"votes": 1,
"user_id": "rodriguezdennis",
"name": "Jennifer Roach",
"url": "http:\\/\\/www.example.com\\/user_details?userid=rodriguezdennis",
"average_stars": 3.5,
"review_count": 12,
"type": "user"
},
{
"index": "useful",
"votes": 8,
"user_id": "rodriguezdennis",
"name": "Jennifer Roach",
"url": "http:\\/\\/www.example.com\\/user_details?userid=rodriguezdennis",
"average_stars": 3.5,
"review_count": 12,
"type": "user"
}
]
}
JSON 파일로 쓰기
매개변수로 데이터를 저장할 파일 경로르 지정한다.
df.to_json('test.json', orient='records')
참고 문서
https://bio-info.tistory.com/113
https://pandas.pydata.org/docs/reference/api/pandas.read_json.html
https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.to_json.html