달나라 노트

Python Pandas : read_json (json 파일을 읽어서 DataFrame으로 만들기. json dataframe 변환.) 본문

Python/Python Pandas

Python Pandas : read_json (json 파일을 읽어서 DataFrame으로 만들기. json dataframe 변환.)

CosmosProject 2022. 11. 12. 03:27
728x90
반응형

 

 

 

pandas의 read_json() method는 json 파일을 읽어와서 DataFrame으로 변환해주는 기능을 합니다.

 

 

Syntax

pandas.read_json(json_file, orient)

 

- json_file

읽어올 json 파일의 경로와 이름입니다. (경로는 상대경로, 절대경로 모두 가능합니다.)

 

 

- orient

json 파일의 format입니다.

columns, index, records, values, split의 다섯 종류가 있습니다.

 

각 orient 값이 어떠한 json format을 의미하는지는 본 글의 아래 부분에서 다루겠습니다.

(format에 대한 자세한 설명은 다음 링크를 참고하시면 좋습니다. https://cosmosproject.tistory.com/684)

 

 

 

 

 

fruits.json

{"0":{"name":"apple","price":3000},"1":{"name":"banana","price":2000},"2":{"name":"peach","price":3500}}

 

테스트를 위해 먼저 json 파일을 생성했습니다.

json 파일의 이름은 fruits.json입니다.

그리고 그 안에는 위같은 내용이 담겨져있습니다.

 

아래에서 다시 보겠지만 위 json 파일의 형식은 index 입니다.

orient 값을 'index' 로 설정해야한다는 의미이죠.

 

이게 뭔말인지는 일단 넘어가고 read_json() method를 먼저 사용해봅시다.

 

import pandas as pd

df_test = pd.read_json('fruits.json', orient='index')
print(df_test)



-- Result
     name  price
0   apple   3000
1  banana   2000
2   peach   3500

 

- pd.read_json('fruits.json', orient='index')

이 부분을 봅시다.

fruits.json 파일을 읽어와서 json 파일의 내용을 DataFrame으로 바꾸는 부분입니다.

 

이때 json 파일에 담긴 내용의 format이 index 형태이기 때문에 orient 옵션을 index로 적었습니다.

 

 

사용법 자체는 굉장히 간단합니다.

다만 json 파일에 그냥 내맘대로 아무렇게나 데이터를 담아놓게되면 read_json() method가 제대로 작동하지 않을 수 있습니다.

반드시 정해진 format으로 json 파일의 내용을 기입해야하며, 그 형태가 무엇인지에 따라 orient 옵션의 값을 조절하면서 사용해야합니다.

 

 

 

이제 orient 값에 따른 format이 어떤 형태인지 알아봅시다.

 

위에서 다룬 fruits.json 파일에 담긴 동일한 json data를 형식만 다르게 바꿔서 설명하겠습니다.

 

 

 

 

orient = 'columns'

먼저 columns format입니다.

 

{"name":{"0":"apple","1":"banana","2":"peach"},"price":{"0":3000,"1":2000,"2":3500}}

 

columns format은 위같은 형태를 가지고 있습니다.

그 규칙을 살펴보면 아래와 같습니다.

 

{
    "column_name_0":
        {
            "row_index_0":"data",
            "row_index_1":"data",
            ...
        },
    "column_name_1":
        {
            "row_index_0":"data",
            "row_index_1":"data",
            ...
        },
    ...
}

 

column 이름이 나오고 각각의 column에는 해당 column에 있는 각 row의 data가 입력됩니다.

 

orient 옵션의 이름이 columns 였던 이유가 바로 위에 있습니다.

json 파일의 format이 column이름을 중심으로 column에 담긴 data가 명시되었기 때문입니다.

 

 

 

 

 

orient = 'index'

index format입니다.

 

{"0":{"name":"apple","price":3000},"1":{"name":"banana","price":2000},"2":{"name":"peach","price":3500}}

 

index format은 위같은 형태를 가지고 있습니다.

그 규칙을 살펴보면 아래와 같습니다.

 

{
    "row_index_0":{
        "column_name_0":"data",
        "column_name_1":"data",
        ...
    },
    "row_index_1":{
        "column_name_0":"data",
        "column_name_1":"data",
        ...
    },
    ...
}

 

각각의 row index가 먼저 표기되어있으며, 해당 row index에 존재하는 column들의 data가 명시되어있습니다.

즉, index를 중심으로 데이터를 나타내기 때문에 orient 옵션 이름이 index인 것이죠.

 

 

 

 

 

 

orient = 'records'

records format입니다.

 

[{"name":"apple","price":3000},{"name":"banana","price":2000},{"name":"peach","price":3500}]

 

records format은 위같은 형태를 가지고 있습니다.

그 규칙을 살펴보면 아래와 같습니다.

 

[
    {
        "column_name_0":"data",
        "column_name_1":"data",
        ...
    },
    {
        "column_name_0":"data",
        "column_name_1":"data",
        ...
    },
    ...
]

 

이번 json format은 특이하게 row index가 없습니다.

대신 하나의 중괄호{} 안에 하나의 행에 대해서 모든 column에 대한 data가 입력되어있습니다.

즉, 가장 바깥에 있는 대괄호[] 안에 data가 포함되어있으며,

중괄호{} 안에는 하나의 행에 대한 정보가 담기게 되는 것이죠.

 

하나의 행은 하나의 record라고도 하기 때문에 index 정보는 제외된 채로 행 data를 나타내는 형식을 records라고 하는 것 같습니다.

 

 

 

 

 

 

orient = 'values'

values format입니다.

 

[["apple",3000],["banana",2000],["peach",3500]]

 

values format은 위같은 형태를 가지고 있습니다.

그 규칙을 살펴보면 아래와 같습니다.

 

[
    [
        "column_0_data",
        "column_1_data",
        ...
    ],
    [
        "column_0_data",
        "column_1_data",
        ...
    ],
    ...
]

 

가장 눈에 띄는 특징은 중괄호{}가 쓰이지 않았다는 것입니다.

그리고 column 이름이나 index 번호가 없죠.

 

각각의 대괄호[]는 하나하나의 행에 있는 모든 data들을 column 순서대로 담고 있습니다.

 

index나 column 이름 정보가 전혀 없는 채로 값만을 나타내고 있는 형태이므로 orient 값의 이름이 values인 것입니다.

 

 

 

 

 

 

orient = 'split'

split format입니다.

 

{"columns":["name","price"],"index":[0,1,2],"data":[["apple",3000],["banana",2000],["peach",3500]]}

 

위 format의 규칙을 보면 아래와 같습니다.

 

{
   "columns":[
       "column_name_0",
       "column_name_1",
       ...
   ],
   "index":[
       row_index_0,
       row_index_1,
       row_index_2,
       ...
   ],
   "data":[
       [index_0_column_0_data, index_0_column_1_data, ...],
       [index_1_column_0_data, index_1_column_1_data, ...],
       [index_2_column_0_data, index_2_column_1_data, ...],
       ...
   ]
}

 

columns에는 존재하는 모든 column 이름이 담겨있습니다.

index에는 존재하는 모든 row index 정보가 담겨있습니다.

data에는 존재하는 모든 data가 마치 orient='values' format과 비슷한 형태로 담겨있습니다.

 

 

 

 

 

 

728x90
반응형
Comments