상세 컨텐츠

본문 제목

판다스 데이터프레임으로 json파일 불러오기

4차

by 木隱 2020. 3. 8. 11:06

본문

공공데이터를 가져올때,

api로 데이터를 가져오는 방법도 있지만,

csv나 json, xml 형태의 파일로 제공되는 방법도 있다.

지난 포스팅에서 공시지가의 경우 csv 형태이어서 다루기가 쉬웠지만,

이번 포스팅에서 건축물대장 총괄표제부의 경우 json 형태이다.


데이터는 세움터의 건축데이터 민간개방시스템에서 자치구 단위로 가져왔다.

http://open.eais.go.kr/opnsvc/opnSvcInqireView.do?viewType=1&searchCondition=01&opnSvcSn=19&searchKeyword=%EA%B1%B4%EC%B6%95%EB%8D%B0%EC%9D%B4%ED%84%B0 

 

건축데이터 민간개방 시스템

개방서비스 유형별 건축데이터 OPEN API 서비스 안내 OPEN API 이용방법을 상세하게 안내해드립니다. 건축인허가 정보에서 관리하는 동별개요, 층별개요, 호별개요, 대수선, 공작물관리대장, 철거멸실관리대장, 가설건축물, 오수정화시설, 주차장, 부설주차장, 전유공용면적, 호별전유공용면적, 지역지구구역, 도로대장, 대지위치, 주택유형 등 속성정보 주택건설사업계획승인 정보에서 관리하는 동별개요, 층별개요, 호별개요, 부대시설, 오수정화시설, 주차장, 부설

open.eais.go.kr

라이브러리는 json, pandas, 그리고, json_normalize를 불러왔다.

import json
import pandas as pd
from pandas.io.json import json_normalize

json파일을 불러오는 방법은 

with open("/gdrive/My Drive/Colab Notebooks/garo/yu_dj.json", encoding='CP949') as f:    
    d= json.load(f)

으로 하면 된다.

인코딩에러가 생길 경우, encoding='CP949'를 넣어주어야 한다.

이렇게 파일을 불러오면

더보기

{"Description":{"PMSNO_GB_CD_NM":"허가번호_구분_코드_명","HHLD_CNT":"세대_수(세대)","BYLOT_CNT":"외필지_수","OUDR_MECH_AREA":"옥외_기계식_면적(㎡)","STCNS_DAY":"착공_일","INDR_AUTO_UTCNT":"옥내_자주식_대수(대)","BC_RAT":"건폐율(%)","SIGUNGU_CD":"시군구_코드","MAIN_PURPS_CD_NM":"주_용도_코드_명","ENGR_GRADE":"에너지_효율등급","HO_CNT":"호_수(호)","VL_RAT_ESTM_TOTAREA":"용적률_산정_연면적(㎡)","OUDR_AUTO_AREA":"옥외_자주식_면적(㎡)","ENGR_EPI":"EPI_점수","NA_UGRND_CD":"새주소_지상지하_코드","NEW_PLAT_PLC":"도로명_대지_위치","MAIN_PURPS_CD":"주_용도_코드","GN_BLD_GRADE":"친환경_건축물_등급","ENGR_RAT":"에너지_절감율","PLAT_AREA":"대지_면적(㎡)","FMLY_CNT":"가구_수(가구)","REGSTR_GB_CD":"대장_구분_코드","ETC_PURPS":"기타_용도","NA_BJDONG_CD":"새주소_법정동_코드","SPLOT_NM":"특수지_명","NA_SUB_BUN":"새주소_부_번","LOT":"로트","OUDR_MECH_UTCNT":"옥외_기계식_대수(대)","PMS_DAY":"허가_일","BJDONG_CD":"법정동_코드","PLAT_GB_CD":"대지_구분_코드","PLAT_PLC":"대지_위치","NEW_OLD_REGSTR_GB_CD":"신_구_대장_구분_코드","PMSNO_KIK_CD":"허가번호_기관_코드","PMSNO_GB_CD":"허가번호_구분_코드","MAIN_BLD_CNT":"주_건축물_수","JI":"지","PMSNO_KIK_CD_NM":"허가번호_기관_코드_명","INDR_MECH_AREA":"옥내_기계식_면적(㎡)","TOT_PKNG_CNT":"총_주차_수","PMSNO_YEAR":"허가번호_년","TOTAREA":"연면적(㎡)","REGSTR_KIND_CD":"대장_종류_코드","INDR_AUTO_AREA":"옥내_자주식_면적(㎡)","NA_ROAD_CD":"새주소_도로_코드","REGSTR_KIND_CD_NM":"대장_종류_코드_명","INDR_MECH_UTCNT":"옥내_기계식_대수(대)","MGM_BLDRGST_PK":"관리_건축물대장_PK","ARCH_AREA":"건축_면적(㎡)","BUN":"번","REGSTR_GB_CD_NM":"대장_구분_코드_명","ATCH_BLD_CNT":"부속_건축물_수","GN_BLD_CERT":"친환경_건축물_인증점수","NA_MAIN_BUN":"새주소_본_번","BLD_NM":"건물_명","NEW_OLD_REGSTR_GB_CD_NM":"신_구_대장_구분_코드_명","OUDR_AUTO_UTCNT":"옥외_자주식_대수(대)","CRTN_DAY":"생성_일자","ITG_BLD_CERT":"지능형_건축물_인증점수","BLOCK":"블록","ITG_BLD_GRADE":"지능형_건축물_등급","USEAPR_DAY":"사용승인_일","ATCH_BLD_AREA":"부속_건축물_면적(㎡)","VL_RAT":"용적률(%)"},
"Data":[{"HHLD_CNT":0,"BYLOT_CNT":0,"OUDR_MECH_AREA":0,"INDR_AUTO_UTCNT":0,"BC_RAT":0,"SIGUNGU_CD":"30200","MAIN_PURPS_CD_NM":"동.식물관련시설","HO_CNT":0,"VL_RAT_ESTM_TOTAREA":107.58,"OUDR_AUTO_AREA":0,"ENGR_EPI":0,"NA_UGRND_CD":"0","NEW_PLAT_PLC":" ","MAIN_PURPS_CD":"21000","ENGR_RAT":0,"PLAT_AREA":0,"FMLY_CNT":1,"REGSTR_GB_CD":"1","ETC_PURPS":"동.식물관련시설","OUDR_MECH_UTCNT":0,"BJDONG_CD":"10100","PLAT_GB_CD":"0","PLAT_PLC":"대전광역시 유성구 원내동 103-4번지","NEW_OLD_REGSTR_GB_CD":"1","MAIN_BLD_CNT":2,"JI":"0004","INDR_MECH_AREA":0,"TOT_PKNG_CNT":0,"TOTAREA":107.58,"REGSTR_KIND_CD":"1","INDR_AUTO_AREA":0,"REGSTR_KIND_CD_NM":"총괄표제부","INDR_MECH_UTCNT":0,"MGM_BLDRGST_PK":"30200-459","ARCH_AREA":107.58,"BUN":"0103","REGSTR_GB_CD_NM":"일반","ATCH_BLD_CNT":0,"GN_BLD_CERT":0,"NEW_OLD_REGSTR_GB_CD_NM":"신대장","OUDR_AUTO_UTCNT":0,"CRTN_DAY":"20171118","ITG_BLD_CERT":0,"ATCH_BLD_AREA":0,"VL_RAT":0},{"HHLD_CNT":0,"BYLOT_CNT":0,"OUDR_MECH_AREA":0,"INDR_AUTO_UTCNT":0,"BC_RAT":0,"SIGUNGU_CD":"30200","HO_CNT":0,"VL_RAT_ESTM_TOTAREA":0,"OUDR_AUTO_AREA":0,"ENGR_EPI":0,"NA_UGRND_CD":"0","NEW_PLAT_PLC":" ","ENGR_RAT":0,"PLAT_AREA":0,"FMLY_CNT":0,"REGSTR_GB_CD":"1","OUDR_MECH_UTCNT":0,"BJDONG_CD":"10100","PLAT_GB_CD":"0","PLAT_PLC":"대전광역시 유성구 원내동 103번지","NEW_OLD_REGSTR_GB_CD":"1","MAIN_BLD_CNT":0,"JI":"0000","INDR_MECH_AREA":0,"TOT_PKNG_CNT":0,"TOTAREA":0,"REGSTR_KIND_CD":"1","INDR_AUTO_AREA":0,"REGSTR_KIND_CD_NM":"총괄표제부","INDR_MECH_UTCNT":0,"MGM_BLDRGST_PK":"30200-458","ARCH_AREA":0,"BUN":"0103","REGSTR_GB_CD_NM":"일반","ATCH_BLD_CNT":0,"GN_BLD_CERT":0,"NEW_OLD_REGSTR_GB_CD_NM":"신대장","OUDR_AUTO_UTCNT":0,"CRTN_DAY":"20171118","ITG_BLD_CERT":0,"ATCH_BLD_AREA":0,"VL_RAT":0}]}

스크롤의 압박이 있어서 2개의 데이터만 잘랐지만, 아무튼 이런 형식이다.

맨 앞에 Description이 딕셔너리 형태로 영문과 국문 칼럼명이 적혀있다.

그 다음 Data에 해당 데이터가 딕셔너리가 리스트로 묶여 있다.

데이터가 들어있는 부분을 json_normalize로 불러들이면 된다.

df = json_normalize(d,'Data')

처음에는 쓸때없어 보였던 Description부분은

df=df.rename(columns={
})

이 사이에 붙여 넣으면 영문 칼럼명을 국문 칼럼명으로 바꿀수 있다.


read_json이나 웹상에서 찾을수 있는 몇가지 방법을 시도했지만, 나에게 작동하는 코드는 이것이었다.

다른 좋은 방법이 있으면 댓글 부탁드립니다요.

관련글 더보기