Python

대용량 CSV 파일 편집하기(python)_건축데이터 민간개방 시스템 활용 예시

범준킴 2023. 2. 5. 13:33
반응형

건축 데이터 민간개방 시스템 메인 화면

 

 이전에 다룬 pd.read_csv를 통해 불러온 자료를 편집하는 방법을 건축데이터 민간개방 시스템 활용 예시로 설명함

pd.read_csv : https://recordinside.tistory.com/4

 

건축데이터 민간개방 시스템 Link : https://open.eais.go.kr/

 

파일 접근 방법은 아래와 같다.

개방서비스 >> 대용량 제공 서비스

건축물 대장 검색창

건축물 대장 검색창에서 업무구분은 건축물대장, 서비스명은 표제부로 검색하여, 가장 최근 자료를 다운로드 한다.

"설명" 파일은 해당 파일의 컬럼 구조를 설명하는4.  자료를 제공하니 표제부와 같이 다운로드 해준다.

해당 자료는 총괄표제부를 메모장에서 조회한 화면이며, 표제부는 메모장에서 열리지 않을 만큼 크기가 매우 크다.

 

다운로드가 완료된 "건축물대장 데이터"와 "설명" 파일을 살펴보자

1. txt 파일로 제공

2. 구분자는 "|"

3. 각 열의 제목이 없다.

4. "설명" 파일을 살펴보면, "건축물대장 표제부"는 총 77개 컬럼으로 이루어져 있다. 

5. 압축을 풀면 파일 크기가 2GB라는 기괴한 크기를 보여준다.

 

 

자 이제 파일을 불러와보자

import pandas as pd

df1 = pd.read_csv("파일경로/파일명.txt", encoding="euc-kr", header=None, sep="|")

pd.read_csv는 txt 파일도 착실하게 잘 불러와준다.(매우 감사한 편)

 

이제 각 열의 제목(이하 컬럼)을 입력해줄 차례.

 

2가지 방법이 있는데,

 

첫 번째 방법은 이전에 다운로드한 "설명" 자료에 있는 컬럼 구조를 list 형태로 만들어서 적용해 주는 방법

 

두 번째 방법은 이전에 다운로드한 "설명" 자료에 있는 컬럼 구조를 pd.read_csv의 argument로 적용해서 불러오는 방법

 

우리는 쉽게쉽게 가기 위해 pd.read_csv의 구문이 길어지더라도 두 번째 방법으로 실행해보자.

import pandas as pd

df1 = pd.read_csv("파일경로/파일명.txt", encoding="euc-kr", header=None, sep="|", names=["관리_건축물대장_PK", "대장_구분_코드", "대장_구분_코드_명", "대장_종류_코드", "대장_종류_코드_명", "대지_위치", "도로명_대지_위치", "건물_명", "시군구_코드", "법정동_코드", "대지_구분_코드", "번", "지", "특수지_명", "블록", "로트", "외필지_수", "새주소_도로_코드", "새주소_법정동_코드", "새주소_지상지하_코드", "새주소_본_번", "새주소_부_번", "동_명", "주_부속_구분_코드", "주_부속_구분_코드_명", "대지_면적(㎡)", "건축_면적(㎡)", "건폐_율(%)", "연면적(㎡)", "용적_률_산정_연면적(㎡)", "용적_률(%)", "구조_코드", "구조_코드_명", "기타_구조", "주_용도_코드", "주_용도_코드_명", "기타_용도", "지붕_코드", "지붕_코드_명", "기타_지붕", "세대_수(세대)", "가구_수(가구)", "높이(m)", "지상_층_수", "지하_층_수", "승용_승강기_수", "비상용_승강기_수", "부속_건축물_수", "부속_건축물_면적(㎡)", "총_동_연면적(㎡)", "옥내_기계식_대수(대)", "옥내_기계식_면적(㎡)", "옥외_기계식_대수(대)", "옥외_기계식_면적(㎡)", "옥내_자주식_대수(대)", "옥내_자주식_면적(㎡)", "옥외_자주식_대수(대)", "옥외_자주식_면적(㎡)", "허가_일", "착공_일", "사용승인_일", "허가번호_년", "허가번호_기관_코드", "허가번호_기관_코드_명", "허가번호_구분_코드", "허가번호_구분_코드_명", "호_수(호)", "에너지효율_등급", "에너지절감_율", "에너지_EPI점수", "친환경_건축물_등급", "친환경_건축물_인증점수", "지능형_건축물_등급", "지능형_건축물_인증점수", "생성_일자", "내진_설계_적용_여부", "내진_능력"])

약간 무식해보이는 방법이라도 어쩔 수 없다. 우리는 쉽게쉽게 가야하기 때문

 

이렇게 되면 우리는 드디어 파이썬에서 건축물대장 데이터를 가지고 분석을 할 수 있는 준비가 된 것이다.

(아직 할게 많다.)

 

우리는 전국에 있는 모든 건축물 데이터를 가지고 왔는데, 전국을 대상으로 분석하는 경우는 드물다.

 

따라서 우리가 원하는 지역의 건축물 데이터를 추출해보자

 

# pandas를 활용한 데이터 열람 및 추출

import pandas as pd

df1 = pd.read_csv("파일경로/파일명.txt", encoding="euc-kr", header=None, sep="|", names=["관리_건축물대장_PK", "대장_구분_코드", "대장_구분_코드_명", "대장_종류_코드", "대장_종류_코드_명", "대지_위치", "도로명_대지_위치", "건물_명", "시군구_코드", "법정동_코드", "대지_구분_코드", "번", "지", "특수지_명", "블록", "로트", "외필지_수", "새주소_도로_코드", "새주소_법정동_코드", "새주소_지상지하_코드", "새주소_본_번", "새주소_부_번", "동_명", "주_부속_구분_코드", "주_부속_구분_코드_명", "대지_면적(㎡)", "건축_면적(㎡)", "건폐_율(%)", "연면적(㎡)", "용적_률_산정_연면적(㎡)", "용적_률(%)", "구조_코드", "구조_코드_명", "기타_구조", "주_용도_코드", "주_용도_코드_명", "기타_용도", "지붕_코드", "지붕_코드_명", "기타_지붕", "세대_수(세대)", "가구_수(가구)", "높이(m)", "지상_층_수", "지하_층_수", "승용_승강기_수", "비상용_승강기_수", "부속_건축물_수", "부속_건축물_면적(㎡)", "총_동_연면적(㎡)", "옥내_기계식_대수(대)", "옥내_기계식_면적(㎡)", "옥외_기계식_대수(대)", "옥외_기계식_면적(㎡)", "옥내_자주식_대수(대)", "옥내_자주식_면적(㎡)", "옥외_자주식_대수(대)", "옥외_자주식_면적(㎡)", "허가_일", "착공_일", "사용승인_일", "허가번호_년", "허가번호_기관_코드", "허가번호_기관_코드_명", "허가번호_구분_코드", "허가번호_구분_코드_명", "호_수(호)", "에너지효율_등급", "에너지절감_율", "에너지_EPI점수", "친환경_건축물_등급", "친환경_건축물_인증점수", "지능형_건축물_등급", "지능형_건축물_인증점수", "생성_일자", "내진_설계_적용_여부", "내진_능력"])

df2 = df1[df1["대지_위치"].str.contains("서울특별시")]

str.contain 함수를 활용하여 추출한다.

 

df1에서 "대지_위치" 컬럼의 값이 "서울특별시"를 포함하는 행(row)만 추출되어 df2로 할당된다.

 

df2에서 필요없는 컬럼이 있는 경우 이를 삭제하는 방법도 알아보자

 

import pandas as pd

df1 = pd.read_csv("파일경로/파일명.txt", encoding="euc-kr", header=None, sep="|", names=["관리_건축물대장_PK", "대장_구분_코드", "대장_구분_코드_명", "대장_종류_코드", "대장_종류_코드_명", "대지_위치", "도로명_대지_위치", "건물_명", "시군구_코드", "법정동_코드", "대지_구분_코드", "번", "지", "특수지_명", "블록", "로트", "외필지_수", "새주소_도로_코드", "새주소_법정동_코드", "새주소_지상지하_코드", "새주소_본_번", "새주소_부_번", "동_명", "주_부속_구분_코드", "주_부속_구분_코드_명", "대지_면적(㎡)", "건축_면적(㎡)", "건폐_율(%)", "연면적(㎡)", "용적_률_산정_연면적(㎡)", "용적_률(%)", "구조_코드", "구조_코드_명", "기타_구조", "주_용도_코드", "주_용도_코드_명", "기타_용도", "지붕_코드", "지붕_코드_명", "기타_지붕", "세대_수(세대)", "가구_수(가구)", "높이(m)", "지상_층_수", "지하_층_수", "승용_승강기_수", "비상용_승강기_수", "부속_건축물_수", "부속_건축물_면적(㎡)", "총_동_연면적(㎡)", "옥내_기계식_대수(대)", "옥내_기계식_면적(㎡)", "옥외_기계식_대수(대)", "옥외_기계식_면적(㎡)", "옥내_자주식_대수(대)", "옥내_자주식_면적(㎡)", "옥외_자주식_대수(대)", "옥외_자주식_면적(㎡)", "허가_일", "착공_일", "사용승인_일", "허가번호_년", "허가번호_기관_코드", "허가번호_기관_코드_명", "허가번호_구분_코드", "허가번호_구분_코드_명", "호_수(호)", "에너지효율_등급", "에너지절감_율", "에너지_EPI점수", "친환경_건축물_등급", "친환경_건축물_인증점수", "지능형_건축물_등급", "지능형_건축물_인증점수", "생성_일자", "내진_설계_적용_여부", "내진_능력"])

df2 = df1[df1["대지_위치"].str.contains("서울특별시")]

df3 = df2.drop(["생성_일자", "내진_설계_적용_여부", "내진_능력"], axis=1)

이 때에는 drop 함수를 사용하는데, 삭제하고자하는 컬럼의 값을 입력해주고, 컬럼을 삭제하기 위한 argument로 axis 값을 지정해주는데 axis 값이 0인 경우는 행(row)을 삭제하고, axis 값이 1인 경우 열(column)을 삭제한다.

 

해당 방식으로 원하는 형태의 데이터가 만들어졌다면, 이제 데이터 분석을 할 차례

 

이 때도 여러 방식이 있는데 우리는 가장 익숙한 방식인 "엑셀"로 분석하고 싶다.

왜냐면 여전히 코딩은 어렵기 때문

 

따라서 우리는 이 데이터를 xlsx 또는 csv 확장자로 내보내기를 하면 엑셀에서 충분히 읽어드릴 수 있을 것이라 판단하고,

to_csv 함수를 활용하여 데이터를 내보내보자.

 

import pandas as pd

df1 = pd.read_csv("파일경로/파일명.txt", encoding="euc-kr", header=None, sep="|", names=["관리_건축물대장_PK", "대장_구분_코드", "대장_구분_코드_명", "대장_종류_코드", "대장_종류_코드_명", "대지_위치", "도로명_대지_위치", "건물_명", "시군구_코드", "법정동_코드", "대지_구분_코드", "번", "지", "특수지_명", "블록", "로트", "외필지_수", "새주소_도로_코드", "새주소_법정동_코드", "새주소_지상지하_코드", "새주소_본_번", "새주소_부_번", "동_명", "주_부속_구분_코드", "주_부속_구분_코드_명", "대지_면적(㎡)", "건축_면적(㎡)", "건폐_율(%)", "연면적(㎡)", "용적_률_산정_연면적(㎡)", "용적_률(%)", "구조_코드", "구조_코드_명", "기타_구조", "주_용도_코드", "주_용도_코드_명", "기타_용도", "지붕_코드", "지붕_코드_명", "기타_지붕", "세대_수(세대)", "가구_수(가구)", "높이(m)", "지상_층_수", "지하_층_수", "승용_승강기_수", "비상용_승강기_수", "부속_건축물_수", "부속_건축물_면적(㎡)", "총_동_연면적(㎡)", "옥내_기계식_대수(대)", "옥내_기계식_면적(㎡)", "옥외_기계식_대수(대)", "옥외_기계식_면적(㎡)", "옥내_자주식_대수(대)", "옥내_자주식_면적(㎡)", "옥외_자주식_대수(대)", "옥외_자주식_면적(㎡)", "허가_일", "착공_일", "사용승인_일", "허가번호_년", "허가번호_기관_코드", "허가번호_기관_코드_명", "허가번호_구분_코드", "허가번호_구분_코드_명", "호_수(호)", "에너지효율_등급", "에너지절감_율", "에너지_EPI점수", "친환경_건축물_등급", "친환경_건축물_인증점수", "지능형_건축물_등급", "지능형_건축물_인증점수", "생성_일자", "내진_설계_적용_여부", "내진_능력"])

df2 = df1[df1["대지_위치"].str.contains("서울특별시")]

df3 = df2.drop(["생성_일자", "내진_설계_적용_여부", "내진_능력"], axis=1)

df3.to_csv("파일경로/파일명.csv", index=False)

to_csv 함수를 활용하여 df3를 내보낼 때, 유의할 점은 "index=False" 옵션을 사용할지 말지 고민하는 것이다.

 

이 옵션을 사용한다면, 만들어진 형태 그대로 출력이 된다.

 

사용하지 않는다면, 만들어진 형태 그대로 + 연번 컬럼이 추가되어 출력된다.

 

자, 이제 우리는 2GB에 육박하는 데이터를 원하는 부분만 잘라서 엑셀에서 불러와 작업을 할 수 있게 되었다!

(짝짝짝...)

 

* 해당 방식은 필자가 가장 자주 사용하는 방식이며, 위 방식보다 개선된 방식을 아시는 분의 경우 알려주시면, 소정의 감사의 말씀을 드립니다...

 

 

반응형