[Python활용 공간분석] 서울시 지하철역 공공데이터 _두 데이터 합치고 결측치제거

Hyejin Beck·2023년 12월 11일

Python

목록 보기
9/23

초기셋팅

############################################

# OS환경 : Mac OS
# VS coda -> Jupyter lab 

############################################ 초기셋팅
import os
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from matplotlib import font_manager, rc
import platform
import matplotlib

import warnings
warnings.filterwarnings('ignore')

############################################ 여기서 Matplotlib 코드를 사용하여 그래프 생성 및 표시
%matplotlib inline

############################################ 시각화 셋팅 
import matplotlib.font_manager as fm
import matplotlib.pyplot as plt
## 폰트 설정 및 마이너스 부호 설정
plt.rc('font', family='NanumSquare') #나눔 글꼴로 설정
#plt.rc('font', family='Malgun Gothic') #맑은 고딕으로 설정
plt.rc('font', family='AppleGothic') #맥
plt.rcParams['axes.unicode_minus'] = False #부호

############################################ Google Maps 설치  
# !pip install googlemaps
############################################ 지하철역 위경도 전처리 파일 불러오기 
geocode = pd.read_csv('seoul_station_geocode.csv')
geocode

############################################ 지하철역 승하차인원 전처리 파일 불러오기 
people = pd.read_csv('seoul_station_people.csv')
people

두 파일 합치기

data = pd.merge(people, geocode, on = '역명', how = 'left')
data.head(4)

# 형태 확인 
people.shape, geocode.shape, data.shape

결측치

# 결측치 확인 
data.isna().sum()

# 결측치가 하나라도 있는 row 확인 
df_nan = data[data.isnull().any(axis=1)]
df_nan.head()

df_nan = data[data.isnull().any(axis=1)]
nan_station_names = df_nan['역명']
result_str = ','.join(nan_station_names)
result_str

결측치가 있는 값들만 따로 모아서, '역명'만 추출해낸 뒤,
역명을 기재하면 위도,경도를 구해주는 함수로 NaN값을 대체할수 있지 않을까?

df_nan.loc[df_nan['역명'] == '강변', ['lat', 'lng']] = get_lat_lng('강변')
df_nan.loc[df_nan['역명'] == '경복궁', ['lat', 'lng']] = get_lat_lng('경복궁')
df_nan.head()

대체가 되긴 했다....
이제 반복문으로 돌려서 NaN값이 있는 row의 '역명' 하나하나 꺼내, lat과 lng을 구해 대체해주자.

for station_name in nan_station_names:
    lat, lng = get_lat_lng(station_name)
    data.loc[data['역명'] == station_name, ['lat', 'lng']] = lat, lng
data.isna().sum() 

그래도 대체가 안되는게 있다.

다시 lat, lng가 NaN인 값들만 확인

data[data['lat'].isna()]

일일이 수기로 대체해준다.

data.loc[data['역명'] == '고려대', ['lat', 'lng']] = get_lat_lng('고려대')
data.loc[data['역명'] == '군자', ['lat', 'lng']] = get_lat_lng('군자')
data.loc[data['역명'] == '대흥', ['lat', 'lng']] = get_lat_lng('대흥')
data.loc[data['역명'] == '미아', ['lat', 'lng']] = get_lat_lng('미아')
data.loc[data['역명'] == '삼성', ['lat', 'lng']] = get_lat_lng('삼성')
data.loc[data['역명'] == '수유', ['lat', 'lng']] = get_lat_lng('수유')
data.loc[data['역명'] == '신정', ['lat', 'lng']] = get_lat_lng('신정')
data.loc[data['역명'] == '용두', ['lat', 'lng']] = get_lat_lng('용두')
data.loc[data['역명'] == '증산', ['lat', 'lng']] = get_lat_lng('증산')

다시 lat, lng가 NaN인 값들만 확인

data[data['lat'].isna()]

수기로 일일이 변경해줬는데도 왜 NaN값이 대체가 안되는지 모르겠다.
일단 그 다음 진도를 나가기 위해
NaN값은 눈물을 머금고 drop하기로 한다.

data = data.dropna()
profile
데이터기반 스토리텔링을 통해 인사이트를 얻습니다.

0개의 댓글