Python/NumPy | Pandas

[Python] Pandas - 데이터 입출력(JSON)

비번변경 2022. 12. 22. 18:47

개요

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