Python 데이터 전처리 실습(부동산거래량)
Data preprocess
import numpy as np
from pandas import read_csv
import pandas as pd
from pandas import DataFrame
from pandas import merge
from pandas import ExcelWriter
from matplotlib import pyplot
파일 확인¶
.head()는 파이썬 데이터프레임 조회시 상위 5줄을 보여준다
#파일 읽기 및 확인
시도별거래량csv = read_csv(r"/Users/donut/tstory/행정구역별_주택매매거래현황_20200812163714.csv", encoding="euc-kr")
시도별거래량csv.head()
시도별거래량csv.shape
데이터프레임 결측치확인하기¶
결측치확인 = 시도별거래량csv.isna()
결측치합계=결측치확인.sum()
결측치합계
시도별거래량DF = 시도별거래량csv.copy()
컬럼명 확인¶
#컬럼명 확인방법
시도별거래량col = list(시도별거래량DF.columns)
print(시도별거래량col)
새롭게 지정해줄 컬럼명 설정¶
데이터프레임 리스트 공백제거 = .replace(" ","")
시도별거래량ncol = []
for i in range(len(시도별거래량col)):
if i==0:
시도별거래량ncol.append("시도")
elif i==1:
시도별거래량ncol.append("구군")
else:
변환=시도별거래량col[i].replace(" ","")
시도별거래량ncol.append(변환)
시도별거래량ncol
컬럼명 바꾸기¶
컬럼명을 바꾸기 위해, 기존 컬럼명과, 새로운 컬럼명을 Dict형태로 대치시켜준다
colDict = {}
for i, v in enumerate(시도별거래량ncol):
# `이름`의 i번째에 대응되는 항목을 `현재인덱스`에서 가져옴
before = 시도별거래량col[i];
colDict[before] = v
colDict
컬럼명 바꾸기¶
파이썬 데이터프레임 컬럼명 바꾸기 = .rename()
시도별거래량전처리 = 시도별거래량DF.rename(columns = colDict)
시도별거래량전처리.head()
인덱스삭제¶
데이터프레임 0번째 인덱스(로우)를 삭제하기
시도별거래량DF = 시도별거래량전처리.drop(시도별거래량전처리.index[0])
시도별거래량DF.head()
인덱스 설정하기¶
인덱스로 설정할 열을 전처리 한 후 인덱스로 지정하겠음
old시도 =list(set(시도별거래량DF['시도']))
old시도
#스위치문을 사용해도 무관합니다.
new시도 = []
for i in range(len(old시도)):
if len(old시도[i]) == 4:
new시도.append(old시도[i][::2])
elif len(old시도[i]) == 3:
new시도.append(old시도[i][:2])
elif len(old시도[i]) >4:
new시도.append(old시도[i][:2])
else:
new시도.append(old시도[i])
new시도
시도DF = DataFrame(old시도)
시도DF['1'] = new시도
시도DF
시도DF.rename(columns = {0:'시도2', '1': 'sido'}, inplace=True)
시도DF
기존DF에 새로운 시도DF join하기¶
원본DF.join(붙힐DF.set_index('붙일DF의 기준컬럼명')['실제 붙일 컬럼명'],on='원본DF의 기준 컬럼명')
#데이터 프레임이름이 너무 길어서 df로이름을 줄이겠습니다.
df=시도별거래량DF.join(시도DF.set_index('시도2')['sido'],on='시도')
df.head()
인덱스 바꾸기¶
sido 열로 인덱스 바꿔주기
현재인덱스 = list(df.index)
시도리스트 = list(df['sido'])
indexDict ={}
for i, v in enumerate(시도리스트):
before = 현재인덱스[i]
indexDict[before] = v
indexDict
df.rename(index=indexDict, inplace=True)
df.drop(['시도','sido'], axis=1, inplace=True)
df
print(df.dtypes.head())
print(df['2019.02'][2])
print(type(df['2019.02'][2]))
데이터형식 변환 문자열을 숫자형으로 (str->int)¶
먼저 df데이터 프레임의 '구군'열은 문자열이기 때문에,
숫자 부분만 숫자열로 바꿔줘야함.
필터를 통해 데이터프레임을 나눈후 다시 합쳐주겠음
df문자 = df.filter(df.columns[0:1])
df문자
df숫자 = df.filter(df.columns[2:])
df숫자.head()
파이썬 데이터프레임 문자를 숫자로 바꾸기¶
df숫자.apply(pd.to_numeric)사용시 "-"라는 문자 때문에 실행이 불가하다는 오류가 뜸
"-"를 "0"으로 바꿔준후 다시 df숫자.apply(pd.to_numeric)를 실행하겠음
df숫자.replace("-","0",inplace =True)
df숫자2=df숫자.apply(pd.to_numeric)
df숫자2.dtypes.head()
데이터 프레임 합치기 concat¶
문자열을 숫자로 바꿔주기위해 나눠놨던 데이터프레임을 다시 합쳐주겠습니다.
다만 concat이 알수없는 이유로 실행되지않아 다른방법을 사용하였습니다.
아래와 같은 방법으로 데이터 프레임의 컬럼명을 재정렬하여 반영하겠습니다.
df숫자2['구군']=list(df문자['구군'])
cols = df숫자2.columns.tolist()
newcols = cols[-1:] + cols[:-1]
'''
colDict = {}
for i,v in enumerate(newcols):
before = cols[i]
colDict[before] = v
colDict
'''
df완성=df숫자2[newcols]
df완성.head()
데이터프레임 전치 구하기¶
데이터 프레임의 행과 열을 바꾸기
소계df = df완성.query('구군 == "소계"')
전치 = 소계df.T
전치.drop(전치.index[0],inplace = True)
전치.head()
# 한글폰트, 그래픽 크기 설정
pyplot.rcParams["font.family"] = 'AppleGothic'
pyplot.rcParams["font.size"] = 16
pyplot.rcParams["figure.figsize"] = (20, 10)
전치.plot()
pyplot.grid()
pyplot.legend(bbox_to_anchor=(1, 0.9))
pyplot.title("월별 시도별 부동산 거래량")
pyplot.xlabel("월")
pyplot.ylabel("거래량")
pyplot.show()
작업한 파일 저장하기¶
writer = ExcelWriter('부동산내역.xlsx')
전치.to_excel(writer, '부동산거래량원장')
writer.save()
마무리¶
전처리 연습을 위해 라이트하게 자료를 정리하였습니다.
대략 부동산 거래량이 언제 줄었고, 언제 다시 폭발적으로 증가했는지 파악이 가능했습니다.
추후에 해당 자료를 좀더 근사하게 가공 하도록 하겠습니다.