[데이터 전처리] 위키피디아 표 데이터 전처리 하기
이 글은 위키피디아에 존재하는 표 형태의 데이터를 전처리 하는 방법에 관한 기록입니다. 위키피디아에 존재하는 표 형태의 데이터를 크롤링 하는 방법에 관한 기록은 이 곳에서 볼 수 있습니다.
실습 Code
먼저 필요한 라이브러리를 불러옵니다.
import pandas as pd
import re
그리고 일전에 저장해둔 데이터셋을 불러옵니다.
df = pd.read_csv('WikipediaTable.csv', index_col=0)
df
개봉월 | 개봉일 | 제목 | 제작/배급 | 출연/제작진 | 장르 | 등급 | |
---|---|---|---|---|---|---|---|
0 | 1월 | 1일 | 〈언니〉 | (주)제이앤씨미디어그룹 , TCO(주)더콘텐츠온 | 감독 임경택출연 이시영, 박세완, 이준혁, 최진호 | 액션 | 청소년 관람불가 (대한민국) |
1 | 1월 | 9일 | 〈내안의 그놈〉 | (주)메리크리스마스 | 감독 강효진출연 박성웅, 진영, 라미란 | 코미디, 판타지 | 15세 관람가 (대한민국) |
2 | 1월 | 9일 | 〈말모이〉 | 롯데 엔터테인먼트 | 감독 엄유나출연 유해진, 윤계상 | 드라마 | 12세 관람가 (대한민국) |
3 | 1월 | 16일 | 〈그대 이름은 장미〉 | (주)리틀빅픽쳐스 | 감독 조석현출연 유호정, 박성웅, 오정세, 채수빈, 하연수 | 코미디 | 12세 관람가 (대한민국) |
4 | 1월 | 16일 | 〈언더독〉 | (주)NEW | 감독 오성윤, 이춘백출연 도경수, 박소담, 박철민 | 애니메이션 | 전체 관람가 (대한민국) |
... | ... | ... | ... | ... | ... | ... | ... |
109 | 12월 | 4일 | 〈너의 여자친구〉 | (주)스톰픽쳐스코리아, 와이드 릴리즈(주) | 감독 이장희 출연 이엘리야, 지일주, 허정민, 김기두, 이진이 | 코미디, 멜로, 로맨스 | 12세 관람가 (대한민국) |
110 | 12월 | 12일 | 〈속물들〉 | (주)삼백상회 300 & Co. | 감독 신아가, 이상철 출연 유다인, 심희섭, 송재림 | 블랙코미디 | 15세 관람가 (대한민국) |
111 | 12월 | 18일 | 〈시동〉 | 넥스트 엔터테인먼트 월드 | 감독 최정열 출연 마동석, 박정민, 정해인, 염정아 | 드라마 | 15세 관람가 (대한민국) |
112 | 12월 | 19일 | 〈백두산〉 | (주)CJ ENM | 감독 이해준, 김병서출연 이병헌, 하정우, 마동석, 전혜진, 배수지 | 어드벤처, 드라마 | 12세 관람가 (대한민국) |
113 | 12월 | 26일 | 〈천문: 하늘에 묻는다〉 | 롯데엔터테인먼트 | 감독 허진호 출연 최민식, 한석규 | 사극 | 12세 관람가 (대한민국) |
114 rows × 7 columns
데이터프레임의 간략한 정보를 확인합니다.
df.info()
<class 'pandas.core.frame.DataFrame'>
Int64Index: 114 entries, 0 to 113
Data columns (total 7 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 개봉월 114 non-null object
1 개봉일 114 non-null object
2 제목 114 non-null object
3 제작/배급 114 non-null object
4 출연/제작진 114 non-null object
5 장르 114 non-null object
6 등급 114 non-null object
dtypes: object(7)
memory usage: 7.1+ KB
제목 전처리
데이터셋의 제목 컬럼에 대한 전처리 함수를 선언합니다.
def PreprocessTitle(string):
import re
p = re.compile('[^〈〉]+')
return p.search(string).group()
이를 적용합니다.
df['제목'] = df['제목'].apply(PreprocessTitle)
제작/배급 및 장르 전처리
데이터셋의 제작/배급 컬럼과 장르 컬럼에 대한 전처리 함수를 선언합니다.
def StringtoList(string):
ls = string.split(', ')
for i in range(len(ls)):
ls[i] = ls[i].strip()
return ls
이를 적용합니다.
df['제작/배급'] = df['제작/배급'].apply(StringtoList)
df['장르'] = df['장르'].apply(StringtoList)
출연/제작진 전처리
데이터셋의 출연/제작진 컬럼에 대한 전처리 함수를 선언합니다.
def PreprocessCrew(string):
import re
ls = string.split('출연 ')
p = re.compile('(?<=감독 ).+')
director = p.search(ls[0]).group().strip().split(', ')
cast = ls[1].split(', ')
return director, cast
이를 적용합니다.
df['감독'] = [PreprocessCrew(crew)[0] for crew in df['출연/제작진']]
df['출연'] = [PreprocessCrew(crew)[1] for crew in df['출연/제작진']]
새롭게 감독 컬럼과 출연 컬럼을 생성했으므로 기존의 출연/제작진 컬럼은 삭제합니다.
df.drop(['출연/제작진'], axis=1, inplace=True)
등급 전처리
데이터셋의 등급 컬럼에 대한 전처리 함수를 선언합니다.
def PreprocessRating(string):
import re
p = re.compile('.+(?=관람)')
result = p.match(string).group()
result = result.strip()
if result=='청소년':
result = '19세'
return result
이를 적용합니다.
df['등급'] = df['등급'].apply(PreprocessRating)
최종적인 데이터셋은 다음과 같습니다.
df
개봉월 | 개봉일 | 제목 | 제작/배급 | 장르 | 등급 | 감독 | 출연 | |
---|---|---|---|---|---|---|---|---|
0 | 1월 | 1일 | 언니 | [(주)제이앤씨미디어그룹, TCO(주)더콘텐츠온] | [액션] | 19세 | [임경택] | [이시영, 박세완, 이준혁, 최진호] |
1 | 1월 | 9일 | 내안의 그놈 | [(주)메리크리스마스] | [코미디, 판타지] | 15세 | [강효진] | [박성웅, 진영, 라미란] |
2 | 1월 | 9일 | 말모이 | [롯데 엔터테인먼트] | [드라마] | 12세 | [엄유나] | [유해진, 윤계상] |
3 | 1월 | 16일 | 그대 이름은 장미 | [(주)리틀빅픽쳐스] | [코미디] | 12세 | [조석현] | [유호정, 박성웅, 오정세, 채수빈, 하연수] |
4 | 1월 | 16일 | 언더독 | [(주)NEW] | [애니메이션] | 전체 | [오성윤, 이춘백] | [도경수, 박소담, 박철민] |
... | ... | ... | ... | ... | ... | ... | ... | ... |
109 | 12월 | 4일 | 너의 여자친구 | [(주)스톰픽쳐스코리아, 와이드 릴리즈(주)] | [코미디, 멜로, 로맨스] | 12세 | [이장희] | [이엘리야, 지일주, 허정민, 김기두, 이진이] |
110 | 12월 | 12일 | 속물들 | [(주)삼백상회 300 & Co.] | [블랙코미디] | 15세 | [신아가, 이상철] | [유다인, 심희섭, 송재림] |
111 | 12월 | 18일 | 시동 | [넥스트 엔터테인먼트 월드] | [드라마] | 15세 | [최정열] | [마동석, 박정민, 정해인, 염정아] |
112 | 12월 | 19일 | 백두산 | [(주)CJ ENM] | [어드벤처, 드라마] | 12세 | [이해준, 김병서] | [이병헌, 하정우, 마동석, 전혜진, 배수지] |
113 | 12월 | 26일 | 천문: 하늘에 묻는다 | [롯데엔터테인먼트] | [사극] | 12세 | [허진호] | [최민식, 한석규] |
114 rows × 8 columns
전체 Code
### Preprocessing ###
# 변수 제목 전처리 함수 #
def PreprocessTitle(string):
import re
p = re.compile('[^〈〉]+')
return p.search(string).group()
# 변수 제작/배급, 장르 전처리 함수 #
def StringtoList(string):
ls = string.split(', ')
for i in range(len(ls)):
ls[i] = ls[i].strip()
return ls
# 변수 출연/제작진 전처리 함수 #
def PreprocessCrew(string):
import re
ls = string.split('출연 ')
p = re.compile('(?<=감독 ).+')
director = p.search(ls[0]).group().strip().split(', ')
cast = ls[1].split(', ')
return director, cast
# 변수 등급 전처리 함수 #
def PreprocessRating(string):
import re
p = re.compile('.+(?=관람)')
result = p.match(string).group()
result = result.strip()
if result == '청소년':
result = '19세'
return result
# 전체 데이터셋 전처리 함수 #
def Preprocessor(data):
data['제목'] = data['제목'].apply(PreprocessTitle)
data['제작/배급'] = data['제작/배급'].apply(StringtoList)
data['감독'] = [PreprocessCrew(crew)[0] for crew in data['출연/제작진']]
data['출연'] = [PreprocessCrew(crew)[1] for crew in data['출연/제작진']]
data['장르'] = data['장르'].apply(StringtoList)
data['등급'] = data['등급'].apply(PreprocessRating)
data.drop(['출연/제작진'], axis=1, inplace=True)
return data
댓글남기기