[Pandas] JSON 읽고 DataFrame으로 상호 변환하기

반응형

Pandas Image

 

 

이번엔 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를 자동으로 인식

 

Contents

    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}]'
     
    이렇게 불러온 js에 대해 pd.DataFrame()함수를 이용하면 바로 데이터프레임으로 변환할 수 있습니다.

    * 출력

    pandas와 json을 이용해 Dataframe 읽기

     

    2)pandas 로만 json 읽기

    df = pd.read_json('test.json')

    위의 1) 과정을 pandas의 pd.read_json() 함수를 이용하면 간단히 할 수 있습니다. 위 과정과 완전히 동일한 데이터 프레임을 얻을 수 있습니다.

    * 출력

    pd.read_json을 이용해 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="columns" <default>

     

    ② orient="records"

    df.to_json(orient='records')

    : 한 행에 대해, {columns:value} 형태의 딕셔너리를 요소로 하는 리스트 형태입니다.

    * 출력

    orient="records"

     

    ③ orient="split"

    df.to_json(orient='split')

    : columns와 index, data를 key로 갖으며, value로는 각 내용을 리스트로 갖는 형태입니다.

    * 출력

    orient="split"

     

    ④ orient="values"

    df.to_json(orient='values')

    : 테이블에서 값만 리스트형태로 갖습니다.

    * 출력

    orient="values"

     

    ⑤ orient="index"

    df.to_json(orient='index')

    : 각 index를 키로 갖으며, value로는 {column:value} 형태의 딕셔너리를 갖습니다.

    * 출력

    orient="index"

     

    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가 어떤 종류든 자동 인식됩니다.

     

    읽어주셔서 감사합니다.

    오늘도 발전하는 당신을 응원합니다!

    다음에 더 유익한 글로 찾아오겠습니다.

     

    * 위의 실습 코드는 아래 링크에 모두 정리되어 있습니다.

     

    GitHub - netsus/pandas_practice: Pandas examples in practice.

    Pandas examples in practice. Contribute to netsus/pandas_practice development by creating an account on GitHub.

    github.com

     

    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
    반응형

    댓글

    Designed by JB FACTORY