행정동과 법정동 코드 파일 사용 방법
한국의 행정구역은 행정동과 법정동이 있다. 부동산 정보등에는 법정동 코드가 사용된다. 이 코드를 얻는 방법과 파이썬에서 불러오는 방법을 알아본다.
행정동
법정동(法定洞)
https://kssc.kostat.go.kr 통계청, 통계분류포털
"한국행정구역분류_2017.7.1.기준.xls" (18M)
이 파일을 다운로드하여 pandas로 읽을 수 있다.
import pandas as pd
fname = '한국행정구역분류_2017.7.1.기준.xls'
df = pd.read_excel(fname, skiprows=2, dtype={'대분류':str, '중분류':str, '소분류':str})
df.drop('Unnamed: 0', axis=1, inplace=True)
df.head()
대분류 | 시도 | 중분류 | 시군구 | 소분류 | 읍면동 | 영문 표기 | 한자 표기 | |
---|---|---|---|---|---|---|---|---|
0 | 11 | 서울특별시 | nan | NaN | nan | NaN | Seoul | 서울特別市 |
1 | 11 | 서울특별시 | 11010 | 종로구 | nan | NaN | Jongno-gu | 鍾路區 |
2 | 11 | 서울특별시 | 11010 | 종로구 | 1101053 | 사직동 | Sajik-dong | 社稷洞 |
3 | 11 | 서울특별시 | 11010 | 종로구 | 1101054 | 삼청동 | Samcheong-dong | 三淸洞 |
4 | 11 | 서울특별시 | 11010 | 종로구 | 1101055 | 부암동 | Buam-dong | 付岩洞 |
df.tail()
대분류 | 시도 | 중분류 | 시군구 | 소분류 | 읍면동 | 영문 표기 | 한자 표기 | |
---|---|---|---|---|---|---|---|---|
3787 | 39 | 제주특별자치도 | 39020 | 서귀포시 | 3902058 | 서홍동 | Seohong-dong | 西烘洞 |
3788 | 39 | 제주특별자치도 | 39020 | 서귀포시 | 3902059 | 대륜동 | Daeryun-dong | 大倫洞 |
3789 | 39 | 제주특별자치도 | 39020 | 서귀포시 | 3902060 | 대천동 | Daecheon-dong | 大川洞 |
3790 | 39 | 제주특별자치도 | 39020 | 서귀포시 | 3902061 | 중문동 | Jungmun-dong | 中文洞 |
3791 | 39 | 제주특별자치도 | 39020 | 서귀포시 | 3902062 | 예래동 | Yerae-dong | 猊來洞 |
통계청의 통계지리정보시스템은 '행정구역 코드 검색 API'를 제공하고 있다
http://sgis.kostat.go.kr/OpenAPI2/subpage/openAPI2_10.jsp
행정구역 코드 검색을 위해 행정구역 코드를 엑셀 파일로 제공하며, 그 URL은 다음과 같다.
http://sgis.kostat.go.kr/OpenAPI2/upload/unitarea_code.xls
위 URL을 바로 읽어 사용할 수 도 있다
import pandas as pd
url = "http://sgis.kostat.go.kr/OpenAPI2/upload/unitarea_code.xls"
df = pd.read_excel(url, skiprows=1)
df.head()
시도코드 | 시도명칭 | 시군구코드 | 시군구명칭 | 읍면동코드 | 읍면동명칭 | |
---|---|---|---|---|---|---|
0 | 11 | 서울특별시 | 11010 | 종로구 | 1101053 | 사직동 |
1 | 11 | 서울특별시 | 11010 | 종로구 | 1101054 | 삼청동 |
2 | 11 | 서울특별시 | 11010 | 종로구 | 1101055 | 부암동 |
3 | 11 | 서울특별시 | 11010 | 종로구 | 1101056 | 평창동 |
4 | 11 | 서울특별시 | 11010 | 종로구 | 1101057 | 무악동 |
df.tail()
시도코드 | 시도명칭 | 시군구코드 | 시군구명칭 | 읍면동코드 | 읍면동명칭 | |
---|---|---|---|---|---|---|
3477 | 39 | 제주특별자치도 | 39020 | 서귀포시 | 3902058 | 서홍동 |
3478 | 39 | 제주특별자치도 | 39020 | 서귀포시 | 3902059 | 대륜동 |
3479 | 39 | 제주특별자치도 | 39020 | 서귀포시 | 3902060 | 대천동 |
3480 | 39 | 제주특별자치도 | 39020 | 서귀포시 | 3902061 | 중문동 |
3481 | 39 | 제주특별자치도 | 39020 | 서귀포시 | 3902062 | 예래동 |
법정동 코드를 다운로드 할 수 있다.
"법정동코드 전체자료.zip" 라는 이름으로 다운로드 할 수 있으며, .txt 파일을 포함하고 있다.
이 .txt 파일을 다음 URL에 공유하였다.
df_areacode = pd.read_csv('https://goo.gl/tM6r3v', sep='\t', dtype={'법정동코드':str})
df_areacode.head()
법정동코드 | 법정동명 | 폐지여부 | |
---|---|---|---|
0 | 1100000000 | 서울특별시 | 존재 |
1 | 1111000000 | 서울특별시 종로구 | 존재 |
2 | 1111010100 | 서울특별시 종로구 청운동 | 존재 |
3 | 1111010200 | 서울특별시 종로구 신교동 | 존재 |
4 | 1111010300 | 서울특별시 종로구 궁정동 | 존재 |
len(df_areacode)
45957
현재 사용하고 있지 않은 법정동코드는 삭제 한다. (폐지여부가 '존재'인 행만 남긴다)
df_areacode = df_areacode[df_areacode['폐지여부'] == '존재']
df_areacode.head()
법정동코드 | 법정동명 | 폐지여부 | |
---|---|---|---|
0 | 1100000000 | 서울특별시 | 존재 |
1 | 1111000000 | 서울특별시 종로구 | 존재 |
2 | 1111010100 | 서울특별시 종로구 청운동 | 존재 |
3 | 1111010200 | 서울특별시 종로구 신교동 | 존재 |
4 | 1111010300 | 서울특별시 종로구 궁정동 | 존재 |
len(df_areacode)
20544
'법정동코드' 컬럼이 숫자로만 되어있어 기본적으로 정수(int) 타입으로 읽힌다. 코드로 사용하기 위해 문자열(str)로 타입을 지정하였다.
df_areacode.tail()
법정동코드 | 법정동명 | 폐지여부 | |
---|---|---|---|
45952 | 5013032022 | 제주특별자치도 서귀포시 표선면 하천리 | 존재 |
45953 | 5013032023 | 제주특별자치도 서귀포시 표선면 성읍리 | 존재 |
45954 | 5013032024 | 제주특별자치도 서귀포시 표선면 가시리 | 존재 |
45955 | 5013032025 | 제주특별자치도 서귀포시 표선면 세화리 | 존재 |
45956 | 5013032026 | 제주특별자치도 서귀포시 표선면 토산리 | 존재 |
단위는 "시/도", "시/군/구", "읍/면/동", "리" 각 2자리로 구성되어 있다. (총 8자리)
지역 구분이 총 4개 레벨("시/도", "시/군/구", "읍/면/동", "리")
이중에서 '시/도' 추출하고자 한다면, 총 8자리 숫자중 뒤쪽 6자리가 모두 '0'인 행(row)를 추출하는 방법을 사용할 수 있다.
# '\d{2}0{8}' : 임의정수 2개, 숫자 0이 8개
# 3611000000 : 세종특별자치시
df_province = df_areacode[ df_areacode['법정동코드'].str.contains('\d{2}0{8}|36110{6}')]
df_province
법정동코드 | 법정동명 | 폐지여부 | |
---|---|---|---|
0 | 1100000000 | 서울특별시 | 존재 |
2615 | 2600000000 | 부산광역시 | 존재 |
2912 | 2700000000 | 대구광역시 | 존재 |
3244 | 2800000000 | 인천광역시 | 존재 |
3579 | 2900000000 | 광주광역시 | 존재 |
3825 | 3000000000 | 대전광역시 | 존재 |
4009 | 3100000000 | 울산광역시 | 존재 |
4241 | 3611000000 | 세종특별자치시 | 존재 |
4391 | 4100000000 | 경기도 | 존재 |
10867 | 4200000000 | 강원도 | 존재 |
13666 | 4300000000 | 충청북도 | 존재 |
16797 | 4400000000 | 충청남도 | 존재 |
22050 | 4500000000 | 전라북도 | 존재 |
25397 | 4600000000 | 전라남도 | 존재 |
30169 | 4700000000 | 경상북도 | 존재 |
39299 | 4800000000 | 경상남도 | 존재 |
45741 | 5000000000 | 제주특별자치도 | 존재 |
우리나라 시/도는 모두 17개 이다.
len(df_province)
17
import pandas as pd
def get_areacode():
df_areacode = pd.read_csv('https://goo.gl/tM6r3v', sep='\t', dtype={'법정동코드':str, '법정동명':str})
df_areacode = df_areacode[df_areacode['폐지여부'] == '존재']
df_areacode = df_areacode[['법정동코드', '법정동명']]
return df_areacode
def get_province():
df_areacode = get_areacode()
df_province = df_areacode[ df_areacode['법정동코드'].str.contains('\d{2}0{8}|36110{6}')]
return df_province
get_areacode().head()
법정동코드 | 법정동명 | |
---|---|---|
0 | 1100000000 | 서울특별시 |
1 | 1111000000 | 서울특별시 종로구 |
2 | 1111010100 | 서울특별시 종로구 청운동 |
3 | 1111010200 | 서울특별시 종로구 신교동 |
4 | 1111010300 | 서울특별시 종로구 궁정동 |
get_province()
법정동코드 | 법정동명 | |
---|---|---|
0 | 1100000000 | 서울특별시 |
2615 | 2600000000 | 부산광역시 |
2912 | 2700000000 | 대구광역시 |
3244 | 2800000000 | 인천광역시 |
3579 | 2900000000 | 광주광역시 |
3825 | 3000000000 | 대전광역시 |
4009 | 3100000000 | 울산광역시 |
4241 | 3611000000 | 세종특별자치시 |
4391 | 4100000000 | 경기도 |
10867 | 4200000000 | 강원도 |
13666 | 4300000000 | 충청북도 |
16797 | 4400000000 | 충청남도 |
22050 | 4500000000 | 전라북도 |
25397 | 4600000000 | 전라남도 |
30169 | 4700000000 | 경상북도 |
39299 | 4800000000 | 경상남도 |
45741 | 5000000000 | 제주특별자치도 |
특정 "시/도"의 코드는 다음과 같이 얻을 수 있다
p = '제주특별자치도'
df_province = get_province()
df_province.loc[df_province['법정동명'] == p, '법정동코드'].values[0]
'5000000000'