Pandas (11) - 지도 시각화 실습 (2)
# 경고 메시지 숨김
import warnings
warnings.filterwarnings('ignore')
import pandas as pd
1. 데이터 내용 파악
data = pd.read_csv('202208_202208_주민등록인구및세대현황_월간.csv', encoding='cp949')
data.head(3)
행정구역 | 2022년08월_총인구수 | 2022년08월_세대수 | 2022년08월_세대당 인구 | 2022년08월_남자 인구수 | 2022년08월_여자 인구수 | 2022년08월_남여 비율 | |
---|---|---|---|---|---|---|---|
0 | 서울특별시 (1100000000) | 9,488,454 | 4,472,975 | 2.12 | 4,601,295 | 4,887,159 | 0.94 |
1 | 서울특별시 종로구 (1111000000) | 143,499 | 73,866 | 1.94 | 69,408 | 74,091 | 0.94 |
2 | 서울특별시 종로구 청운효자동(1111051500) | 11,766 | 5,198 | 2.26 | 5,392 | 6,374 | 0.85 |
data.info()
# object형 자료->float이나 integer로 되지 못한 이유가 있을것
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 3865 entries, 0 to 3864
Data columns (total 7 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 행정구역 3865 non-null object
1 2022년08월_총인구수 3865 non-null object
2 2022년08월_세대수 3865 non-null object
3 2022년08월_세대당 인구 3865 non-null float64
4 2022년08월_남자 인구수 3865 non-null object
5 2022년08월_여자 인구수 3865 non-null object
6 2022년08월_남여 비율 3865 non-null float64
dtypes: float64(2), object(5)
memory usage: 211.5+ KB
2. column 이름 수정
data.columns
Index(['행정구역', '2022년08월_총인구수', '2022년08월_세대수', '2022년08월_세대당 인구',
'2022년08월_남자 인구수', '2022년08월_여자 인구수', '2022년08월_남여 비율'],
dtype='object')
data.columns = ['행정구역', '총인구수', '세대수', '세대당 인구',
'남자', '여자', '남여 비율']
data.head(3)
행정구역 | 총인구수 | 세대수 | 세대당 인구 | 남자 | 여자 | 남여 비율 | |
---|---|---|---|---|---|---|---|
0 | 서울특별시 (1100000000) | 9,488,454 | 4,472,975 | 2.12 | 4,601,295 | 4,887,159 | 0.94 |
1 | 서울특별시 종로구 (1111000000) | 143,499 | 73,866 | 1.94 | 69,408 | 74,091 | 0.94 |
2 | 서울특별시 종로구 청운효자동(1111051500) | 11,766 | 5,198 | 2.26 | 5,392 | 6,374 | 0.85 |
3. 필요없는 컬럼 제거 - ‘남여 비율’
data.drop(columns='남여 비율', inplace=True)
data.head(3)
행정구역 | 총인구수 | 세대수 | 세대당 인구 | 남자 | 여자 | |
---|---|---|---|---|---|---|
0 | 서울특별시 (1100000000) | 9,488,454 | 4,472,975 | 2.12 | 4,601,295 | 4,887,159 |
1 | 서울특별시 종로구 (1111000000) | 143,499 | 73,866 | 1.94 | 69,408 | 74,091 |
2 | 서울특별시 종로구 청운효자동(1111051500) | 11,766 | 5,198 | 2.26 | 5,392 | 6,374 |
4. GeoJSON과 연결할 키를 확인
지역별 총계가 존재 -> 분리작업이 필요
- 행정구역을 이용해서 시, 구, 동 column을 만들어준다.
- 개별 데이터는 남기고 대분류, 중분류에 해당하는 값은 제거한다.
- 부산 지역의 데이터만 가지고 와서 idx는 새로 부여한다.
# dropna를 편하게 쓰기 위해 조정
data['행정구역'] = data['행정구역'].str.split('(').str.get(0)
data['시'] = data['행정구역'].str.split().str.get(0)
data['구'] = data['행정구역'].str.split().str.get(1)
data['동'] = data['행정구역'].str.split().str.get(2).str.split('(').str.get(0)
data.head(3)
행정구역 | 총인구수 | 세대수 | 세대당 인구 | 남자 | 여자 | 시 | 구 | 동 | |
---|---|---|---|---|---|---|---|---|---|
0 | 서울특별시 | 9,488,454 | 4,472,975 | 2.12 | 4,601,295 | 4,887,159 | 서울특별시 | NaN | NaN |
1 | 서울특별시 종로구 | 143,499 | 73,866 | 1.94 | 69,408 | 74,091 | 서울특별시 | 종로구 | NaN |
2 | 서울특별시 종로구 청운효자동 | 11,766 | 5,198 | 2.26 | 5,392 | 6,374 | 서울특별시 | 종로구 | 청운효자동 |
data.dropna(inplace=True) # defatult axis=0 이므로 행단위로 제거
data.head(3)
행정구역 | 총인구수 | 세대수 | 세대당 인구 | 남자 | 여자 | 시 | 구 | 동 | |
---|---|---|---|---|---|---|---|---|---|
2 | 서울특별시 종로구 청운효자동 | 11,766 | 5,198 | 2.26 | 5,392 | 6,374 | 서울특별시 | 종로구 | 청운효자동 |
3 | 서울특별시 종로구 사직동 | 9,278 | 4,668 | 1.99 | 4,124 | 5,154 | 서울특별시 | 종로구 | 사직동 |
4 | 서울특별시 종로구 삼청동 | 2,384 | 1,188 | 2.01 | 1,130 | 1,254 | 서울특별시 | 종로구 | 삼청동 |
busan = data[data['시'] == '부산광역시']
busan.head(3)
행정구역 | 총인구수 | 세대수 | 세대당 인구 | 남자 | 여자 | 시 | 구 | 동 | |
---|---|---|---|---|---|---|---|---|---|
454 | 부산광역시 중구 중앙동 | 3,139 | 2,435 | 1.29 | 1,475 | 1,664 | 부산광역시 | 중구 | 중앙동 |
455 | 부산광역시 중구 동광동 | 2,590 | 1,703 | 1.52 | 1,323 | 1,267 | 부산광역시 | 중구 | 동광동 |
456 | 부산광역시 중구 대청동 | 6,185 | 3,562 | 1.74 | 2,877 | 3,308 | 부산광역시 | 중구 | 대청동 |
busan.reset_index(drop=True, inplace=True) # 기존 idx를 데이터에 포함시키지 않고 제거하기 위해 drop=True
busan.head(3)
행정구역 | 총인구수 | 세대수 | 세대당 인구 | 남자 | 여자 | 시 | 구 | 동 | |
---|---|---|---|---|---|---|---|---|---|
0 | 부산광역시 중구 중앙동 | 3,139 | 2,435 | 1.29 | 1,475 | 1,664 | 부산광역시 | 중구 | 중앙동 |
1 | 부산광역시 중구 동광동 | 2,590 | 1,703 | 1.52 | 1,323 | 1,267 | 부산광역시 | 중구 | 동광동 |
2 | 부산광역시 중구 대청동 | 6,185 | 3,562 | 1.74 | 2,877 | 3,308 | 부산광역시 | 중구 | 대청동 |
5. 총인구수, 남자, 여자 column의 데이터 타입을 정수형으로 변경
- astype
- to_numeric : nan으로 채워버림
busan['총인구수'] = busan['총인구수'].str.replace(',', '').astype(int)
busan['남자'] = busan['남자'].str.replace(',', '').astype(int)
busan['여자'] = busan['여자'].str.replace(',', '').astype(int)
busan.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 205 entries, 0 to 204
Data columns (total 9 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 행정구역 205 non-null object
1 총인구수 205 non-null int32
2 세대수 205 non-null object
3 세대당 인구 205 non-null float64
4 남자 205 non-null int32
5 여자 205 non-null int32
6 시 205 non-null object
7 구 205 non-null object
8 동 205 non-null object
dtypes: float64(1), int32(3), object(5)
memory usage: 12.1+ KB
busan.head(3)
행정구역 | 총인구수 | 세대수 | 세대당 인구 | 남자 | 여자 | 시 | 구 | 동 | |
---|---|---|---|---|---|---|---|---|---|
0 | 부산광역시 중구 중앙동 | 3139 | 2,435 | 1.29 | 1475 | 1664 | 부산광역시 | 중구 | 중앙동 |
1 | 부산광역시 중구 동광동 | 2590 | 1,703 | 1.52 | 1323 | 1267 | 부산광역시 | 중구 | 동광동 |
2 | 부산광역시 중구 대청동 | 6185 | 3,562 | 1.74 | 2877 | 3308 | 부산광역시 | 중구 | 대청동 |
6. 동별, 구별, 부산인구를 차트로 표시(인구순 5개 항목만 출력)
# 구별 인구수
gu = busan.groupby(['구'])['총인구수'].sum().sort_values(ascending=False).head().reset_index() # seaborn 사용위해 idx 데이터화
gu
구 | 총인구수 | |
---|---|---|
0 | 해운대구 | 389841 |
1 | 부산진구 | 351682 |
2 | 사하구 | 304029 |
3 | 북구 | 280116 |
4 | 동래구 | 274638 |
import seaborn as sns
sns.barplot(data=gu, x='구', y='총인구수')
<AxesSubplot:xlabel='구', ylabel='총인구수'>
# 동별 인구수
dong = busan.sort_values(by='총인구수', ascending=False).head()
dong
행정구역 | 총인구수 | 세대수 | 세대당 인구 | 남자 | 여자 | 시 | 구 | 동 | |
---|---|---|---|---|---|---|---|---|---|
202 | 부산광역시 기장군 정관읍 | 81242 | 32,042 | 2.54 | 40196 | 41046 | 부산광역시 | 기장군 | 정관읍 |
161 | 부산광역시 강서구 명지1동 | 53762 | 21,188 | 2.54 | 26986 | 26776 | 부산광역시 | 강서구 | 명지1동 |
200 | 부산광역시 기장군 기장읍 | 52213 | 25,757 | 2.03 | 25411 | 26802 | 부산광역시 | 기장군 | 기장읍 |
83 | 부산광역시 남구 용호제1동 | 43554 | 17,119 | 2.54 | 20860 | 22694 | 부산광역시 | 남구 | 용호제1동 |
99 | 부산광역시 북구 화명제1동 | 40825 | 14,385 | 2.84 | 19953 | 20872 | 부산광역시 | 북구 | 화명제1동 |
sns.barplot(data=dong, x='동', y='총인구수')
<AxesSubplot:xlabel='동', ylabel='총인구수'>
7. Json파일 정리
GeoJSON 편집
구별로 하고 싶으면 sggnm
동별로 하고 싶으면 adm_nm를 불러와 잘라서 써야함
부산것만 쓸것이기에 sidonm에서 부산광역시만
import json
jsonfile = open('HangJeongDong_ver20220701.geojson', 'r', encoding='utf-8').read()
type(jsonfile)
str
jsondata = json.loads(jsonfile) # 문자열이라 load's'
type(jsondata)
dict
json_busan = {"type": "FeatureCollection"}
json_pick = [] # features에 넣을 데이터 저장
json_dong = [] # 동 정보 저장
for item in jsondata['features']:
# print(time[properties]'['sidonm']')
if item['properties']['sidonm'] == '부산광역시':
dong = item['properties']['adm_nm'].split()[-1].strip() # strip 공백제거
item['id'] = dong
json_pick.append(item)
json_dong.append(dong)
json_busan['features'] = json_pick
# json_busan
8. 지도 그리기
import folium
loc = [35.1681608, 129.0573853]
m = folium.Map(loc, zoom_start=11)
folium.Choropleth(geo_data=json_busan, data=busan, columns=['동', '총인구수'], key_on='feature.id').add_to(m)
m
키값이 맞지 않은 곳이 black으로 표시됨
json_dong = sorted(json_dong)
#json_dong
df_dong = sorted(busan['동'])
# df_dong
# 길이 확인
len(json_dong), len(df_dong)
(205, 205)
for i, item in enumerate(zip(df_dong, json_dong)):
print(i, item)
0 ('가덕도동', '가덕도동')
1 ('가락동', '가락동')
2 ('가야제1동', '가야2동')
3 ('가야제2동', '가야제1동')
4 ('감만제1동', '감만1동')
5 ('감만제2동', '감만2동')
6 ('감전동', '감전동')
7 ('감천제1동', '감천1동')
8 ('감천제2동', '감천2동')
9 ('강동동', '강동동')
10 ('개금제1동', '개금1동')
11 ('개금제2동', '개금2동')
12 ('개금제3동', '개금3동')
13 ('거제제1동', '거제1동')
14 ('거제제2동', '거제2동')
15 ('거제제3동', '거제3동')
16 ('거제제4동', '거제4동')
17 ('광복동', '광복동')
18 ('광안제1동', '광안1동')
19 ('광안제2동', '광안2동')
20 ('광안제3동', '광안3동')
21 ('광안제4동', '광안4동')
22 ('괘법동', '괘법동')
23 ('괴정제1동', '괴정1동')
24 ('괴정제2동', '괴정2동')
25 ('괴정제3동', '괴정3동')
26 ('괴정제4동', '괴정4동')
27 ('구서제1동', '구서1동')
28 ('구서제2동', '구서2동')
29 ('구평동', '구평동')
30 ('구포제1동', '구포1동')
31 ('구포제2동', '구포2동')
32 ('구포제3동', '구포3동')
33 ('금곡동', '금곡동')
34 ('금사회동동', '금사회동동')
35 ('금성동', '금성동')
36 ('기장읍', '기장읍')
37 ('남부민제1동', '남부민1동')
38 ('남부민제2동', '남부민2동')
39 ('남산동', '남산동')
40 ('남천제1동', '남천1동')
41 ('남천제2동', '남천2동')
42 ('남포동', '남포동')
43 ('남항동', '남항동')
44 ('녹산동', '녹산동')
45 ('다대제1동', '다대1동')
46 ('다대제2동', '다대2동')
47 ('당감제1동', '당감1동')
48 ('당감제2동', '당감2동')
49 ('당감제4동', '당감4동')
50 ('당리동', '당리동')
51 ('대연제1동', '대연1동')
52 ('대연제3동', '대연3동')
53 ('대연제4동', '대연4동')
54 ('대연제5동', '대연5동')
55 ('대연제6동', '대연6동')
56 ('대저1동', '대저1동')
57 ('대저2동', '대저2동')
58 ('대청동', '대청동')
59 ('덕천제1동', '덕천1동')
60 ('덕천제2동', '덕천2동')
61 ('덕천제3동', '덕천3동')
62 ('덕포제1동', '덕포1동')
63 ('덕포제2동', '덕포2동')
64 ('동광동', '동광동')
65 ('동대신제1동', '동대신1동')
66 ('동대신제2동', '동대신2동')
67 ('동대신제3동', '동대신3동')
68 ('동삼제1동', '동삼1동')
69 ('동삼제2동', '동삼2동')
70 ('동삼제3동', '동삼3동')
71 ('만덕제1동', '만덕1동')
72 ('만덕제2동', '만덕2동')
73 ('만덕제3동', '만덕3동')
74 ('망미제1동', '망미1동')
75 ('망미제2동', '망미2동')
76 ('명륜동', '명륜동')
77 ('명장제1동', '명장1동')
78 ('명장제2동', '명장2동')
79 ('명지1동', '명지1동')
80 ('명지2동', '명지2동')
81 ('모라제1동', '모라1동')
82 ('모라제3동', '모라3동')
83 ('문현제1동', '문현1동')
84 ('문현제2동', '문현2동')
85 ('문현제3동', '문현3동')
86 ('문현제4동', '문현4동')
87 ('민락동', '민락동')
88 ('반송제1동', '반송1동')
89 ('반송제2동', '반송2동')
90 ('반여제1동', '반여1동')
91 ('반여제2동', '반여2동')
92 ('반여제3동', '반여3동')
93 ('반여제4동', '반여4동')
94 ('범일제1동', '범일1동')
95 ('범일제2동', '범일2동')
96 ('범일제5동', '범일5동')
97 ('범천제1동', '범천1동')
98 ('범천제2동', '범천2동')
99 ('보수동', '보수동')
100 ('복산동', '복산동')
101 ('봉래제1동', '봉래1동')
102 ('봉래제2동', '봉래2동')
103 ('부곡제1동', '부곡1동')
104 ('부곡제2동', '부곡2동')
105 ('부곡제3동', '부곡3동')
106 ('부곡제4동', '부곡4동')
107 ('부민동', '부민동')
108 ('부암제1동', '부암1동')
109 ('부암제3동', '부암3동')
110 ('부전제1동', '부전1동')
111 ('부전제2동', '부전2동')
112 ('부평동', '부평동')
113 ('사직제1동', '사직1동')
114 ('사직제2동', '사직2동')
115 ('사직제3동', '사직3동')
116 ('삼락동', '삼락동')
117 ('서대신제1동', '서1동')
118 ('서대신제3동', '서2동')
119 ('서대신제4동', '서3동')
120 ('서제1동', '서대신1동')
121 ('서제2동', '서대신3동')
122 ('서제3동', '서대신4동')
123 ('선두구동', '선두구동')
124 ('송정동', '송정동')
125 ('수민동', '수민동')
126 ('수영동', '수영동')
127 ('수정제1동', '수정1동')
128 ('수정제2동', '수정2동')
129 ('수정제4동', '수정4동')
130 ('수정제5동', '수정5동')
131 ('신선동', '신선동')
132 ('신평제1동', '신평1동')
133 ('신평제2동', '신평2동')
134 ('아미동', '아미동')
135 ('안락제1동', '안락1동')
136 ('안락제2동', '안락2동')
137 ('암남동', '암남동')
138 ('양정제1동', '양정1동')
139 ('양정제2동', '양정2동')
140 ('엄궁동', '엄궁동')
141 ('연산제1동', '연산1동')
142 ('연산제2동', '연산2동')
143 ('연산제3동', '연산3동')
144 ('연산제4동', '연산4동')
145 ('연산제5동', '연산5동')
146 ('연산제6동', '연산6동')
147 ('연산제8동', '연산8동')
148 ('연산제9동', '연산9동')
149 ('연지동', '연지동')
150 ('영선제1동', '영선1동')
151 ('영선제2동', '영선2동')
152 ('영주제1동', '영주1동')
153 ('영주제2동', '영주2동')
154 ('온천제1동', '온천1동')
155 ('온천제2동', '온천2동')
156 ('온천제3동', '온천3동')
157 ('용당동', '용당동')
158 ('용호제1동', '용호1동')
159 ('용호제2동', '용호2동')
160 ('용호제3동', '용호3동')
161 ('용호제4동', '용호4동')
162 ('우암동', '우1동')
163 ('우제1동', '우2동')
164 ('우제2동', '우3동')
165 ('우제3동', '우암동')
166 ('일광읍', '일광읍')
167 ('장림제1동', '장림1동')
168 ('장림제2동', '장림2동')
169 ('장안읍', '장안읍')
170 ('장전제1동', '장전1동')
171 ('장전제2동', '장전2동')
172 ('재송제1동', '재송1동')
173 ('재송제2동', '재송2동')
174 ('전포제1동', '전포1동')
175 ('전포제2동', '전포2동')
176 ('정관읍', '정관읍')
177 ('좌제1동', '좌1동')
178 ('좌제2동', '좌2동')
179 ('좌제3동', '좌3동')
180 ('좌제4동', '좌4동')
181 ('좌천동', '좌천동')
182 ('주례제1동', '주례1동')
183 ('주례제2동', '주례2동')
184 ('주례제3동', '주례3동')
185 ('중앙동', '중1동')
186 ('중제1동', '중2동')
187 ('중제2동', '중앙동')
188 ('철마면', '철마면')
189 ('청룡노포동', '청룡노포동')
190 ('청학제1동', '청학1동')
191 ('청학제2동', '청학2동')
192 ('초량제1동', '초량1동')
193 ('초량제2동', '초량2동')
194 ('초량제3동', '초량3동')
195 ('초량제6동', '초량6동')
196 ('초읍동', '초읍동')
197 ('초장동', '초장동')
198 ('충무동', '충무동')
199 ('하단제1동', '하단1동')
200 ('하단제2동', '하단2동')
201 ('학장동', '학장동')
202 ('화명제1동', '화명1동')
203 ('화명제2동', '화명2동')
204 ('화명제3동', '화명3동')
- json데이터 편집 : 가야제1동->가야1동
json_busan = {"type": "FeatureCollection"}
json_pick = [] # features에 넣을 데이터 저장
json_dong = [] # 동 정보 저장
for item in jsondata['features']:
# print(time[properties]'['sidonm']')
if item['properties']['sidonm'] == '부산광역시':
dong = item['properties']['adm_nm'].split()[-1].strip() # strip 공백제거
if dong == '가야제1동':
dong = '가야1동'
item['id'] = dong
json_pick.append(item)
json_dong.append(dong)
json_busan['features'] = json_pick
json_dong = sorted(json_dong)
df_dong = sorted(busan['동'])
for i, item in enumerate(zip(df_dong, json_dong)):
print(i, item)
0 ('가덕도동', '가덕도동')
1 ('가락동', '가락동')
2 ('가야제1동', '가야1동')
3 ('가야제2동', '가야2동')
4 ('감만제1동', '감만1동')
5 ('감만제2동', '감만2동')
6 ('감전동', '감전동')
7 ('감천제1동', '감천1동')
8 ('감천제2동', '감천2동')
9 ('강동동', '강동동')
10 ('개금제1동', '개금1동')
11 ('개금제2동', '개금2동')
12 ('개금제3동', '개금3동')
13 ('거제제1동', '거제1동')
14 ('거제제2동', '거제2동')
15 ('거제제3동', '거제3동')
16 ('거제제4동', '거제4동')
17 ('광복동', '광복동')
18 ('광안제1동', '광안1동')
19 ('광안제2동', '광안2동')
20 ('광안제3동', '광안3동')
21 ('광안제4동', '광안4동')
22 ('괘법동', '괘법동')
23 ('괴정제1동', '괴정1동')
24 ('괴정제2동', '괴정2동')
25 ('괴정제3동', '괴정3동')
26 ('괴정제4동', '괴정4동')
27 ('구서제1동', '구서1동')
28 ('구서제2동', '구서2동')
29 ('구평동', '구평동')
30 ('구포제1동', '구포1동')
31 ('구포제2동', '구포2동')
32 ('구포제3동', '구포3동')
33 ('금곡동', '금곡동')
34 ('금사회동동', '금사회동동')
35 ('금성동', '금성동')
36 ('기장읍', '기장읍')
37 ('남부민제1동', '남부민1동')
38 ('남부민제2동', '남부민2동')
39 ('남산동', '남산동')
40 ('남천제1동', '남천1동')
41 ('남천제2동', '남천2동')
42 ('남포동', '남포동')
43 ('남항동', '남항동')
44 ('녹산동', '녹산동')
45 ('다대제1동', '다대1동')
46 ('다대제2동', '다대2동')
47 ('당감제1동', '당감1동')
48 ('당감제2동', '당감2동')
49 ('당감제4동', '당감4동')
50 ('당리동', '당리동')
51 ('대연제1동', '대연1동')
52 ('대연제3동', '대연3동')
53 ('대연제4동', '대연4동')
54 ('대연제5동', '대연5동')
55 ('대연제6동', '대연6동')
56 ('대저1동', '대저1동')
57 ('대저2동', '대저2동')
58 ('대청동', '대청동')
59 ('덕천제1동', '덕천1동')
60 ('덕천제2동', '덕천2동')
61 ('덕천제3동', '덕천3동')
62 ('덕포제1동', '덕포1동')
63 ('덕포제2동', '덕포2동')
64 ('동광동', '동광동')
65 ('동대신제1동', '동대신1동')
66 ('동대신제2동', '동대신2동')
67 ('동대신제3동', '동대신3동')
68 ('동삼제1동', '동삼1동')
69 ('동삼제2동', '동삼2동')
70 ('동삼제3동', '동삼3동')
71 ('만덕제1동', '만덕1동')
72 ('만덕제2동', '만덕2동')
73 ('만덕제3동', '만덕3동')
74 ('망미제1동', '망미1동')
75 ('망미제2동', '망미2동')
76 ('명륜동', '명륜동')
77 ('명장제1동', '명장1동')
78 ('명장제2동', '명장2동')
79 ('명지1동', '명지1동')
80 ('명지2동', '명지2동')
81 ('모라제1동', '모라1동')
82 ('모라제3동', '모라3동')
83 ('문현제1동', '문현1동')
84 ('문현제2동', '문현2동')
85 ('문현제3동', '문현3동')
86 ('문현제4동', '문현4동')
87 ('민락동', '민락동')
88 ('반송제1동', '반송1동')
89 ('반송제2동', '반송2동')
90 ('반여제1동', '반여1동')
91 ('반여제2동', '반여2동')
92 ('반여제3동', '반여3동')
93 ('반여제4동', '반여4동')
94 ('범일제1동', '범일1동')
95 ('범일제2동', '범일2동')
96 ('범일제5동', '범일5동')
97 ('범천제1동', '범천1동')
98 ('범천제2동', '범천2동')
99 ('보수동', '보수동')
100 ('복산동', '복산동')
101 ('봉래제1동', '봉래1동')
102 ('봉래제2동', '봉래2동')
103 ('부곡제1동', '부곡1동')
104 ('부곡제2동', '부곡2동')
105 ('부곡제3동', '부곡3동')
106 ('부곡제4동', '부곡4동')
107 ('부민동', '부민동')
108 ('부암제1동', '부암1동')
109 ('부암제3동', '부암3동')
110 ('부전제1동', '부전1동')
111 ('부전제2동', '부전2동')
112 ('부평동', '부평동')
113 ('사직제1동', '사직1동')
114 ('사직제2동', '사직2동')
115 ('사직제3동', '사직3동')
116 ('삼락동', '삼락동')
117 ('서대신제1동', '서1동')
118 ('서대신제3동', '서2동')
119 ('서대신제4동', '서3동')
120 ('서제1동', '서대신1동')
121 ('서제2동', '서대신3동')
122 ('서제3동', '서대신4동')
123 ('선두구동', '선두구동')
124 ('송정동', '송정동')
125 ('수민동', '수민동')
126 ('수영동', '수영동')
127 ('수정제1동', '수정1동')
128 ('수정제2동', '수정2동')
129 ('수정제4동', '수정4동')
130 ('수정제5동', '수정5동')
131 ('신선동', '신선동')
132 ('신평제1동', '신평1동')
133 ('신평제2동', '신평2동')
134 ('아미동', '아미동')
135 ('안락제1동', '안락1동')
136 ('안락제2동', '안락2동')
137 ('암남동', '암남동')
138 ('양정제1동', '양정1동')
139 ('양정제2동', '양정2동')
140 ('엄궁동', '엄궁동')
141 ('연산제1동', '연산1동')
142 ('연산제2동', '연산2동')
143 ('연산제3동', '연산3동')
144 ('연산제4동', '연산4동')
145 ('연산제5동', '연산5동')
146 ('연산제6동', '연산6동')
147 ('연산제8동', '연산8동')
148 ('연산제9동', '연산9동')
149 ('연지동', '연지동')
150 ('영선제1동', '영선1동')
151 ('영선제2동', '영선2동')
152 ('영주제1동', '영주1동')
153 ('영주제2동', '영주2동')
154 ('온천제1동', '온천1동')
155 ('온천제2동', '온천2동')
156 ('온천제3동', '온천3동')
157 ('용당동', '용당동')
158 ('용호제1동', '용호1동')
159 ('용호제2동', '용호2동')
160 ('용호제3동', '용호3동')
161 ('용호제4동', '용호4동')
162 ('우암동', '우1동')
163 ('우제1동', '우2동')
164 ('우제2동', '우3동')
165 ('우제3동', '우암동')
166 ('일광읍', '일광읍')
167 ('장림제1동', '장림1동')
168 ('장림제2동', '장림2동')
169 ('장안읍', '장안읍')
170 ('장전제1동', '장전1동')
171 ('장전제2동', '장전2동')
172 ('재송제1동', '재송1동')
173 ('재송제2동', '재송2동')
174 ('전포제1동', '전포1동')
175 ('전포제2동', '전포2동')
176 ('정관읍', '정관읍')
177 ('좌제1동', '좌1동')
178 ('좌제2동', '좌2동')
179 ('좌제3동', '좌3동')
180 ('좌제4동', '좌4동')
181 ('좌천동', '좌천동')
182 ('주례제1동', '주례1동')
183 ('주례제2동', '주례2동')
184 ('주례제3동', '주례3동')
185 ('중앙동', '중1동')
186 ('중제1동', '중2동')
187 ('중제2동', '중앙동')
188 ('철마면', '철마면')
189 ('청룡노포동', '청룡노포동')
190 ('청학제1동', '청학1동')
191 ('청학제2동', '청학2동')
192 ('초량제1동', '초량1동')
193 ('초량제2동', '초량2동')
194 ('초량제3동', '초량3동')
195 ('초량제6동', '초량6동')
196 ('초읍동', '초읍동')
197 ('초장동', '초장동')
198 ('충무동', '충무동')
199 ('하단제1동', '하단1동')
200 ('하단제2동', '하단2동')
201 ('학장동', '학장동')
202 ('화명제1동', '화명1동')
203 ('화명제2동', '화명2동')
204 ('화명제3동', '화명3동')
- df데이터 수정 : 거제1~4동 제외한 주소는 ‘제’ 삭제, 4곳은 수정
busan['동'] = busan['동'].str.replace('제', '')
# busan['동'].str.replace('제', '').to_list()
busan['동'] = busan['동'].replace(['거1동', '거2동', '거3동', '거4동'], ['거제1동', '거제2동', '거제3동', '거제4동']) # 전체일치 찾기
json_dong = sorted(json_dong)
df_dong = sorted(busan['동'])
for i, item in enumerate(zip(df_dong, json_dong)):
print(i, item)
0 ('가덕도동', '가덕도동')
1 ('가락동', '가락동')
2 ('가야1동', '가야1동')
3 ('가야2동', '가야2동')
4 ('감만1동', '감만1동')
5 ('감만2동', '감만2동')
6 ('감전동', '감전동')
7 ('감천1동', '감천1동')
8 ('감천2동', '감천2동')
9 ('강동동', '강동동')
10 ('개금1동', '개금1동')
11 ('개금2동', '개금2동')
12 ('개금3동', '개금3동')
13 ('거제1동', '거제1동')
14 ('거제2동', '거제2동')
15 ('거제3동', '거제3동')
16 ('거제4동', '거제4동')
17 ('광복동', '광복동')
18 ('광안1동', '광안1동')
19 ('광안2동', '광안2동')
20 ('광안3동', '광안3동')
21 ('광안4동', '광안4동')
22 ('괘법동', '괘법동')
23 ('괴정1동', '괴정1동')
24 ('괴정2동', '괴정2동')
25 ('괴정3동', '괴정3동')
26 ('괴정4동', '괴정4동')
27 ('구서1동', '구서1동')
28 ('구서2동', '구서2동')
29 ('구평동', '구평동')
30 ('구포1동', '구포1동')
31 ('구포2동', '구포2동')
32 ('구포3동', '구포3동')
33 ('금곡동', '금곡동')
34 ('금사회동동', '금사회동동')
35 ('금성동', '금성동')
36 ('기장읍', '기장읍')
37 ('남부민1동', '남부민1동')
38 ('남부민2동', '남부민2동')
39 ('남산동', '남산동')
40 ('남천1동', '남천1동')
41 ('남천2동', '남천2동')
42 ('남포동', '남포동')
43 ('남항동', '남항동')
44 ('녹산동', '녹산동')
45 ('다대1동', '다대1동')
46 ('다대2동', '다대2동')
47 ('당감1동', '당감1동')
48 ('당감2동', '당감2동')
49 ('당감4동', '당감4동')
50 ('당리동', '당리동')
51 ('대연1동', '대연1동')
52 ('대연3동', '대연3동')
53 ('대연4동', '대연4동')
54 ('대연5동', '대연5동')
55 ('대연6동', '대연6동')
56 ('대저1동', '대저1동')
57 ('대저2동', '대저2동')
58 ('대청동', '대청동')
59 ('덕천1동', '덕천1동')
60 ('덕천2동', '덕천2동')
61 ('덕천3동', '덕천3동')
62 ('덕포1동', '덕포1동')
63 ('덕포2동', '덕포2동')
64 ('동광동', '동광동')
65 ('동대신1동', '동대신1동')
66 ('동대신2동', '동대신2동')
67 ('동대신3동', '동대신3동')
68 ('동삼1동', '동삼1동')
69 ('동삼2동', '동삼2동')
70 ('동삼3동', '동삼3동')
71 ('만덕1동', '만덕1동')
72 ('만덕2동', '만덕2동')
73 ('만덕3동', '만덕3동')
74 ('망미1동', '망미1동')
75 ('망미2동', '망미2동')
76 ('명륜동', '명륜동')
77 ('명장1동', '명장1동')
78 ('명장2동', '명장2동')
79 ('명지1동', '명지1동')
80 ('명지2동', '명지2동')
81 ('모라1동', '모라1동')
82 ('모라3동', '모라3동')
83 ('문현1동', '문현1동')
84 ('문현2동', '문현2동')
85 ('문현3동', '문현3동')
86 ('문현4동', '문현4동')
87 ('민락동', '민락동')
88 ('반송1동', '반송1동')
89 ('반송2동', '반송2동')
90 ('반여1동', '반여1동')
91 ('반여2동', '반여2동')
92 ('반여3동', '반여3동')
93 ('반여4동', '반여4동')
94 ('범일1동', '범일1동')
95 ('범일2동', '범일2동')
96 ('범일5동', '범일5동')
97 ('범천1동', '범천1동')
98 ('범천2동', '범천2동')
99 ('보수동', '보수동')
100 ('복산동', '복산동')
101 ('봉래1동', '봉래1동')
102 ('봉래2동', '봉래2동')
103 ('부곡1동', '부곡1동')
104 ('부곡2동', '부곡2동')
105 ('부곡3동', '부곡3동')
106 ('부곡4동', '부곡4동')
107 ('부민동', '부민동')
108 ('부암1동', '부암1동')
109 ('부암3동', '부암3동')
110 ('부전1동', '부전1동')
111 ('부전2동', '부전2동')
112 ('부평동', '부평동')
113 ('사직1동', '사직1동')
114 ('사직2동', '사직2동')
115 ('사직3동', '사직3동')
116 ('삼락동', '삼락동')
117 ('서1동', '서1동')
118 ('서2동', '서2동')
119 ('서3동', '서3동')
120 ('서대신1동', '서대신1동')
121 ('서대신3동', '서대신3동')
122 ('서대신4동', '서대신4동')
123 ('선두구동', '선두구동')
124 ('송정동', '송정동')
125 ('수민동', '수민동')
126 ('수영동', '수영동')
127 ('수정1동', '수정1동')
128 ('수정2동', '수정2동')
129 ('수정4동', '수정4동')
130 ('수정5동', '수정5동')
131 ('신선동', '신선동')
132 ('신평1동', '신평1동')
133 ('신평2동', '신평2동')
134 ('아미동', '아미동')
135 ('안락1동', '안락1동')
136 ('안락2동', '안락2동')
137 ('암남동', '암남동')
138 ('양정1동', '양정1동')
139 ('양정2동', '양정2동')
140 ('엄궁동', '엄궁동')
141 ('연산1동', '연산1동')
142 ('연산2동', '연산2동')
143 ('연산3동', '연산3동')
144 ('연산4동', '연산4동')
145 ('연산5동', '연산5동')
146 ('연산6동', '연산6동')
147 ('연산8동', '연산8동')
148 ('연산9동', '연산9동')
149 ('연지동', '연지동')
150 ('영선1동', '영선1동')
151 ('영선2동', '영선2동')
152 ('영주1동', '영주1동')
153 ('영주2동', '영주2동')
154 ('온천1동', '온천1동')
155 ('온천2동', '온천2동')
156 ('온천3동', '온천3동')
157 ('용당동', '용당동')
158 ('용호1동', '용호1동')
159 ('용호2동', '용호2동')
160 ('용호3동', '용호3동')
161 ('용호4동', '용호4동')
162 ('우1동', '우1동')
163 ('우2동', '우2동')
164 ('우3동', '우3동')
165 ('우암동', '우암동')
166 ('일광읍', '일광읍')
167 ('장림1동', '장림1동')
168 ('장림2동', '장림2동')
169 ('장안읍', '장안읍')
170 ('장전1동', '장전1동')
171 ('장전2동', '장전2동')
172 ('재송1동', '재송1동')
173 ('재송2동', '재송2동')
174 ('전포1동', '전포1동')
175 ('전포2동', '전포2동')
176 ('정관읍', '정관읍')
177 ('좌1동', '좌1동')
178 ('좌2동', '좌2동')
179 ('좌3동', '좌3동')
180 ('좌4동', '좌4동')
181 ('좌천동', '좌천동')
182 ('주례1동', '주례1동')
183 ('주례2동', '주례2동')
184 ('주례3동', '주례3동')
185 ('중1동', '중1동')
186 ('중2동', '중2동')
187 ('중앙동', '중앙동')
188 ('철마면', '철마면')
189 ('청룡노포동', '청룡노포동')
190 ('청학1동', '청학1동')
191 ('청학2동', '청학2동')
192 ('초량1동', '초량1동')
193 ('초량2동', '초량2동')
194 ('초량3동', '초량3동')
195 ('초량6동', '초량6동')
196 ('초읍동', '초읍동')
197 ('초장동', '초장동')
198 ('충무동', '충무동')
199 ('하단1동', '하단1동')
200 ('하단2동', '하단2동')
201 ('학장동', '학장동')
202 ('화명1동', '화명1동')
203 ('화명2동', '화명2동')
204 ('화명3동', '화명3동')
loc = [35.1681608, 129.0573853]
m = folium.Map(loc, zoom_start=11)
folium.Choropleth(geo_data=json_busan, data=busan, columns=['동', '총인구수'],
key_on='feature.id', fill_color='PuRd', fill_opacity=0.8).add_to(m)
m
# 툴팁 표시
loc = [35.1681608, 129.0573853]
m = folium.Map(loc, zoom_start=11)
cho = folium.Choropleth(geo_data=json_busan, data=busan, columns=['동', '총인구수'],
key_on='feature.id', fill_color='PuRd', fill_opacity=0.8).add_to(m)
cho.geojson.add_child(folium.features.GeoJsonTooltip(['adm_nm'], labels=False))
m
Reference
- 이 포스트는 SeSAC 인공지능 자연어처리, 컴퓨터비전 기술을 활용한 응용 SW 개발자 양성 과정 - 심선조 강사님의 강의를 정리한 내용입니다.
- 행정안전부 : 주민등록 인구 및 세대현황
댓글남기기