상세 컨텐츠

본문 제목

광역단체별 공시지가 파일을 자치구 별로 구분하여 파일 만들기

4차

by 木隱 2020. 3. 6. 15:46

본문

사실 굳이 파이썬으로 할 일은 아닐수도 있지만, 

엑셀에서는 파일 읽어오는 것도 부담되고, 

스크롤의 압박도 있고, 

파이썬 연습도 할 겸 해본다.

광역단체별 공시지가 파일을 받아서, 

자치구 별로 구분하여 독립파일로 저장하는 것이다. 


공시지가 csv 파일은 국가공간정보포털의 개별공시지가정보 페이지에서 가져왔다.

http://openapi.nsdi.go.kr/nsdi/eios/ServiceDetail.do?svcSe=F&svcId=F012&provOrg=NIDO

 

국가공간정보포털

 

openapi.nsdi.go.kr

관심지역이 대전광역시여서, 대전광역시 파일만 가져왔다.

압축파일로 보관된 파일을 풀어서 엑셀에서 열어 확인하고자 했으나, 

데이터가 많아서 그런지 원활하지 못했다.

압축을 푼 파일은 구글 드라이브에 올려서 코랩에서 활용가능하도록 했다.


늘 그렇듯이 구글드라이브를 마운트하고, 판다스를 불러왔다.

csv 파일을 불러오는데 필드명이 한글이어서 그런지 오류가 발생했고,

encoding='CP949'를 붙여주어서 해결하였다. 

df=pd.read_csv("/gdrive/My Drive/Colab Notebooks/garo/AL_30_D151_20191126.csv", encoding='CP949')
df.head(10)

데이터는 잘 불러져왔다. 

데이터를 살펴보니 1990년부터 1999년까지 10년치의 데이터가 있었다. 

필요한 데이터는 최신이니 1999년 데이터만 따로 모았다.

df1999=df[df['기준년도']==1999]
df1999.head()

두번째 해결해야할 부분은 시와 구와 동 그리고, 주번과 부번을 나누는 일이다.

고유번호 19자리는 이 정보를 모두 가지고 있다. 

앞의 세자리 (이경우 301)은 광역을 표시한다. (이경우 대전)

그다음 세자리는 (이경우 101) 기초를 표시한다. (이경우 동구)

그다음 네자리는 (이경우 0100) 읍면동을 표시한다. (이경우 원동)

그다음 한자리는 (이경우 1) 일반번지인지 산번지인지를 표시한다. (이경우 일반번지)

그다음 네자리는 (이경우 0020) 주번을 표시한다. (이경우 20번지)

그다음 네자리는 (이경우 0001) 부번을 표시한다. (이경우 1번지)

코드로 합축된 내용은 법정동명과 특수지 구분코드, 지번으로 표시되어 있다. 

코드는 코드대로, 법정동명은 법정동명대로 나누었다. 

지번은 굳이 나누지 않았다. 

코드를 나누기 위해서는 우선 int 형태(숫자열)를 str 형태(문자열)로 변환하여 사용하였다. 

df1999['고유번호']=df1999['고유번호'].apply(str)
df1999['시코드']=df1999['고유번호'].apply(lambda e: e[0:3])
df1999['구코드']=df1999['고유번호'].apply(lambda e: e[3:6])
df1999['동코드']=df1999['고유번호'].apply(lambda e: e[6:10])
df1999['산코드']=df1999['고유번호'].apply(lambda e: e[10:11])
df1999['주번']=df1999['고유번호'].apply(lambda e: e[11:15])
df1999['부번']=df1999['고유번호'].apply(lambda e: e[15:19])
df1999['시']=df1999['법정동명'].apply(lambda e: e.split(' ')[0])
df1999['구']=df1999['법정동명'].apply(lambda e: e.split(' ')[1])
df1999['동']=df1999['법정동명'].apply(lambda e: e.split(' ')[2])
df1999.head()

실행결과,

에러는 아니지만

더보기

A value is trying to be set on a copy of a slice from a DataFrame. Try using .loc[row_indexer,col_indexer] = value instead

라는 메세지가 떴다. 

이 메세지 관련은 나중에 공부해서 다른 포스팅에 올리겠다.


결과는 만족스러웠다.

구별로 나누어 데이터프레임을 만드는데, 구코드로 했더니 오류가 난다.

유성구의 구코드가 001인데 여기서 에러가 난다.

숫자열과 문자열에 따른 조건식 문제인거 같은데, 

귀차니즘이 작동하여 구이름으로 검색하여 데이터 프레임을 나누고 저장하였다.

df_east=df1999[df1999['구']=='동구']
df_west=df1999[df1999['구']=='서구']
df_mid=df1999[df1999['구']=='중구']
df_yu=df1999[df1999['구']=='유성구']
df_dd=df1999[df1999['구']=='대덕구']
df_east.to_csv("/gdrive/My Drive/Colab Notebooks/garo/east_dj.csv",index=False, encoding='utf-8-sig')
df_mid.to_csv("/gdrive/My Drive/Colab Notebooks/garo/mid_dj.csv",index=False, encoding='utf-8-sig')
df_yu.to_csv("/gdrive/My Drive/Colab Notebooks/garo/yu_dj.csv",index=False, encoding='utf-8-sig')
df_west.to_csv("/gdrive/My Drive/Colab Notebooks/garo/west_dj.csv",index=False, encoding='utf-8-sig')
df_dd.to_csv("/gdrive/My Drive/Colab Notebooks/garo/dd_dj.csv",index=False, encoding='utf-8-sig')

이후에는 구별로 나눠진 파일을 동별로 다시 만져보는 작업을 할 계획이다. 

관련글 더보기