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