[python] 주소값만 있을 때 위경도 찾는 방법
안녕하세요!
데이터 분석을 하다보면
특히 folium으로 위치를 시각화 할 때는 숫자로 된 위경도 값이 필요한데
데이터 파일 자체에 주소만 나와있고 위경도 값이 누락되어 있는 경우가 발생합니다.
그 때 위경도 값을 구하는 방법을 알아보도록 하겠습니다ㅎㅎ
step1. 데이터 준비
오늘 예제로 사용할 데이터는 공공데이터의 인천 중구 커피숍 파일입니다.
아래의 링크에서 csv파일을 다운받아 주세요:)
다른 파일이 있으시다면 그 파일을 사용하셔도 무방합니다.
https://www.data.go.kr/data/15086876/fileData.do
step2. 데이터 확인
# csv파일 불러오기
csv = pd.read_csv('incheon_coffeeshop_20210805.csv',encoding='cp949')
print(csv.head())
출력:
전에 다운받은 데이터는 위와 같은 정보를 포함하고 있음을 알 수 있습니다.
위경도 값을 찾기 전에 위의 데이터에서 도로명 주소만 따로 추출해 보도록 하겠습니다.
# 데이터프레임 주소값 추출
address= csv['소재지도로명주소']
print(address.head())
출력:
주소를 보면 맨 뒤 에 '1층'과 같은 상세주소도 포함됨을 알 수 있습니다.
위경도 값에는 층수가 포함이 되지 않고, 주소를 위경도 변환시 오류가 날 수 있어 필요한 주소만 남겨주고 나머지는 지워주는 작업을 진행하겠습니다.
step3. 필요한 주소만 남겨놓기
# 주소 데이터 깔끔하게 다듬기
for i in range(len(address)):
a = address[i].split(' ')
address[i] = " ".join(a[0:4])
print(address)
출력:
사진과 같이 필요한 정보만 담아졌음을 확인할 수 있습니다.
step4. 위경도 변환하기
그럼 이제 위 주소를 가지고 위경도 값으로 바꿔주겠습니다.
이 작업을 진행하려면 먼저 geopy라는 라이브러리를 import 해주어야 하는데요,
아래와 같이 명령창에 pip 명령어를입력해서 다운받아 주세요.
pip install geopy
그 후 아래와 같이 함수를 작성해줍니다.
####### 도로명주소 위도 경도 값으로 바꿔주기 ########
from geopy.geocoders import Nominatim
geo_local = Nominatim(user_agent='South Korea')
# 위도, 경도 반환하는 함수
def geocoding(address):
try:
geo = geo_local.geocode(address)
x_y = [geo.latitude, geo.longitude]
return x_y
except:
return [0,0]
위의 함수는 geocoding함수 안에 주소를 넣어주면 그 주소에 맞는 위도, 경도를
리스트로 만들어 [위도, 경도]로 반환해주는 함수입니다.
주소가 올바르지 않은 형식인 경우에는 [0,0]을 반환합니다.
이제 이 함수를 이용하여 커피숍의 위경도 값을 추출해 주도록 하겠습니다.
#####주소를 위,경도 값으로 변환하기 #####
latitude = []
longitude =[]
for i in address:
latitude.append(geocoding(i)[0])
longitude.append(geocoding(i)[1])
그 후 데이터프레임으로 만들어 한눈에 보이도록 해 줍니다.
#####Dataframe만들기######
address_df = pd.DataFrame({'카페이름': csv['사업장명'],'상세주소':csv['소재지도로명주소'],'주소':address,'위도':latitude,'경도':longitude})
#df저장
address_df.to_csv('jungu_incheon_coffeeshop.csv')
이렇게 주소값만으로 위경도 값을 찾을 수 있습니다 :)
전체 코드
import pandas as pd
# csv파일 불러오기
csv = pd.read_csv('incheon_coffeeshop_20210805.csv',encoding='cp949')
print(csv.head())
# 데이터프레임 주소값 추출
address= csv['소재지도로명주소']
print(address.head())
# 주소 데이터 깔끔하게 다듬기
for i in range(len(address)):
a = address[i].split(' ')
address[i] = " ".join(a[0:4])
print(address)
####### 도로명주소 위도 경도 값으로 바꿔주기 ########
from geopy.geocoders import Nominatim
geo_local = Nominatim(user_agent='South Korea')
# 위도, 경도 반환하는 함수
def geocoding(address):
try:
geo = geo_local.geocode(address)
x_y = [geo.latitude, geo.longitude]
return x_y
except:
return [0,0]
#####주소를 위,경도 값으로 변환하기 #####
latitude = []
longitude =[]
for i in address:
latitude.append(geocoding(i)[0])
longitude.append(geocoding(i)[1])
#####Dataframe만들기######
address_df = pd.DataFrame({'카페이름': csv['사업장명'],'상세주소':csv['소재지도로명주소'],'주소':address,'위도':latitude,'경도':longitude})
#df저장
address_df.to_csv('jungu_incheon_coffeeshop.csv')
마무리
오늘은 주소정보만 있을때 위치 정보로 바꾸어 주는 방법을 알아보았는데요
필요시 활용해 주시길 바랍니다. ㅎㅎ
그리고 코드 관련 질문이나 기타 의견이 있다면 댓글로 남겨주세요 :)
++ 22/08/04 예외처리 추가
++ 관련한 최신 포스팅은 아래에서 확인 가능합니다.
https://wonhwa1.blogspot.com/2022/10/python-geopy.html