본문 바로가기
공부/Python

[pandas] 대한민국 주소체계 분리해서 사전만들기

by 병진들 2021. 7. 9.

일반적인 문서(docx, pdf, pptx ... )에서 주소를 찾아야 하는 일이 생겼다.

공수가 많이 들어갈 것 같은 작업이라 미뤘지만 이제는 미룰 수 없는.. 근데 생각보다 빨리 잘 끝났다.

 

https://www.juso.go.kr/addrlink/addressBuildDevNew.do?menu=mainJusoDb 

 

도로명주소 DB 다운로드 | 도로명주소 개발자센터

 

www.juso.go.kr

위 사이트에서 대한민국 주소 데이터베이스를 다운받을 수 있었다. (우리나라도 요즘 잘해놓네...)

 

내가 필요한 정보는 우리나라의 도로명, 시도명, 시군구명, 읍면동명 이렇게 네가지였고

다운받은 DB를 찾아보니 적절히 분류된게 있어서 사이트에서 제공해준 [가이드]를 참고해 전처리 하였다.

 

전처리한 DB는 '개선_도로명코드_전체분' 이다. 나는 도로명, 읍면동 정보까지 모두 필요했기때문에..

2021년 6월기준 데이터를 사용했고 전처리한 데이터를 업로드 하려 했지만 10MB이상이라 업로드가 안된다 ㅠㅠ

 

이제 해당 데이터를 활용하여 사전을 만들어보자.

 

데이터 로드

import pandas as pd
df = pd.read_csv('address_DB.txt', sep = "|", engine='python', encoding = "cp949")
df.head()

df.head() 결과

해당 데이터에서 column별로 이름을 뽑아낼 생각이다.

생각보다 데이터 크기가 크므로 hash(dictionary)를 사용하는걸 추천한다.

 

중복제거 겸 도로명 counting 을 위한 함수

def generate_hash_dictionary(datas:list):
    dictionary = {}
    for data in datas:
        if data in dictionary:
            dictionary[data] += 1
        else:
            dictionary[data] = 1
    return dictionary

 

처리 결과

load_name = df['도로명'].values.tolist()
load_name = generate_hash_dictionary(load_name)

load_name

맨 뒤글자 추출 및 counting 함수

위 함수랑 똑같은데 data에 [-1]만 붙여줌..

def cutting_last_string(datas:list):
    dictionary = {}
    for data in datas:
        data = data[-1]
        if data in dictionary:
            dictionary[data] += 1
        else:
            dictionary[data] = 1
    return dictionary

 

위 함수 돌리면 나오는 결과

 

이런식으로 도로명, 시도명, 읍면동명 등 구분을 다 해주고 위함수를 약간 수정하여 data[:-1] 로 추출해주면 딱 이름만 나온다. 이 결과를 활용하여 주소 사전을 만들었다.

def cutting_name_string(datas:list):
    dictionary = {}
    for data in datas:
        data = data[:-1]
        if data in dictionary:
            dictionary[data] += 1
        else:
            dictionary[data] = 1
    return dictionary

data[:-1]

이제 정규식과 조합해서 잘 활용해보자.....ㅠㅠ

 

 

ps. 도로명 이후에 시군구, 읍면동 같은 경우는 null값이 꽤 있으므로 

dfs= df['시군구명'].dropna(axis=0)

이런식으로 nan값을 제거해 사용하면 된다.

댓글