Python Pandas : to_json (DataFrame을 json 파일로 만들기.)
pandas의 to_json() method는 DataFrame을 json 파일로 생성해주는 기능을 가집니다.
Syntax
DataFrame.to_json(file_name, orient)
- file_name
생성할 json 파일의 이름을 적습니다.
json 파일은 test_file.json 처럼 json이라는 확장자를 갖습니다.
- orient
생성할 json 파일의 format을 의미합니다.
columns, index, records, values, split의 다섯 종류가 있습니다.
각각의 orient 값이 어떤 형태를 의미하는지는 예시를 통해 알아봅시다.
import pandas as pd
dict_test = {
'name': ['apple', 'banana', 'peach'],
'price': [3000, 2000, 3500]
}
df_test = pd.DataFrame(dict_test)
print(df_test)
df_test.to_json('fruits.json', orient='columns')
-- Result
name price
0 apple 3000
1 banana 2000
2 peach 3500
위 예시는 테스트용 DataFrame을 만들고 이 DataFrame을 json 형태로 변환하여 fruits.json 파일을 생성하는 코드입니다.
- df_test.to_json('fruits.json', orient='columns')
이 부분을 봅시다.
df_test에 to_json() method를 적용했으니 df_test를 json 파일로 바꾸라는 의미입니다.
파일명은 'fruits.json' 입니다. 파일명만 적었기 때문에 python code 파일이 있는 위치와 동일한 directory에 fruits.json 파일이 생성됩니다.
원하는 경로가 있다면 상대경로나 절대경로로 입력해주면 됩니다.
orient 옵션은 columns로 적었습니다.
orient 옵션의 기본값은 columns입니다.
이제 생성된 fruits.json 파일을 열어보면 아래와 같은 내용이 보일겁니다.
{"name":{"0":"apple","1":"banana","2":"peach"},"price":{"0":3000,"1":2000,"2":3500}}
json 파일은 여러 형식(format)으로 적힐 수 있습니다.
pandas의 to_json() method에서 인식하는 columns라는 orient 옵션은 위같은 형태를 의미합니다.
위 형태를 잘 보면 아래와 같은 규칙이 있는 것을 알 수 있습니다.
{
"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가 명시되었기 때문입니다.
json 파일로 변경하는건 위처럼 하면 끝입니다.
이제 orient 옵션을 변경하면서 과연 어떤 형태가 되는지 직접 실행해봅시다.
orient = 'index'
import pandas as pd
dict_test = {
'name': ['apple', 'banana', 'peach'],
'price': [3000, 2000, 3500]
}
df_test = pd.DataFrame(dict_test)
print(df_test)
df_test.to_json('fruits.json', orient='index')
orient 옵션을 index로 설정하였습니다.
그러면 아래와 같은 형태의 json 파일이 생성됩니다.
{"0":{"name":"apple","price":3000},"1":{"name":"banana","price":2000},"2":{"name":"peach","price":3500}}
위 파일을 보면 아래와 같은 규칙이 있음을 알 수 있습니다.
{
"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'
이번에는 orient 옵션을 records로 설정해봅시다.
import pandas as pd
dict_test = {
'name': ['apple', 'banana', 'peach'],
'price': [3000, 2000, 3500]
}
df_test = pd.DataFrame(dict_test)
print(df_test)
df_test.to_json('fruits.json', orient='records')
결과로 생성된 json 파일의 내용은 아래와 같습니다.
[{"name":"apple","price":3000},{"name":"banana","price":2000},{"name":"peach","price":3500}]
위 json 파일의 규칙을 보면 아래와 같습니다.
[
{
"column_name_0":"data",
"column_name_1":"data",
...
},
{
"column_name_0":"data",
"column_name_1":"data",
...
},
...
]
이번 json 파일은 특이하게 row index가 없습니다.
대신 하나의 중괄호{} 안에 하나의 행에 대해서 모든 column에 대한 data가 입력되어있습니다.
즉, 가장 바깥에 있는 대괄호[] 안에 dataframe 정보가 담기며,
중괄호{} 안에는 하나의 행에 대한 정보가 담기게 되는 것이죠.
하나의 행은 하나의 record라고도 하기 때문에 index 없이 행 정보를 나타내는 형식을 records라고 하는 것 같습니다.
orient = 'values'
orient 옵션을 records로 설정해봅시다.
import pandas as pd
dict_test = {
'name': ['apple', 'banana', 'peach'],
'price': [3000, 2000, 3500]
}
df_test = pd.DataFrame(dict_test)
print(df_test)
df_test.to_json('fruits.json', orient='values')
생성된 json 파일의 내용은 아래와 같습니다.
[["apple",3000],["banana",2000],["peach",3500]]
일단 가장 눈에띄는건 중괄호가 쓰이지 않았네요.
또한 column 이름이나 index가 없습니다.
위 json format의 규칙은 아래와 같습니다.
[
[
"column_0_data",
"column_1_data",
...
],
[
"column_0_data",
"column_1_data",
...
],
...
]
위 json 형태를 보면 column 이름이나 index 정보는 존재하지 않습니다.
각각의 대괄호[]는 하나하나의 행에 있는 모든 데이터만을 column 순서대로 담고 있습니다.
index나 column 이름이 없는 채로 DataFrame의 값만을 나타내는 format이기 때문에 orient값이 values로 칭해집니다.
orient = 'split'
orient 옵션을 split으로 설정해봅시다.
import pandas as pd
dict_test = {
'name': ['apple', 'banana', 'peach'],
'price': [3000, 2000, 3500]
}
df_test = pd.DataFrame(dict_test)
print(df_test)
df_test.to_json('fruits.json', orient='split')
생성된 json 파일의 내용은 아래와 같습니다.
{"columns":["name","price"],"index":[0,1,2],"data":[["apple",3000],["banana",2000],["peach",3500]]}
형태가 좀 특이합니다.
약간 지금까지 봐왔던 orient 형식들이 다 합쳐진 느낌입니다.
columns에는 존재하는 모든 column 정보가 담깁니다.
index에는 존재하는 모든 index 정보가 담깁니다.
data에는 존재하는 모든 data가 마치 orient='values' format처럼 담기게 됩니다.
split 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, ...],
...
]
}