[데이터 전처리] 위키피디아 표 데이터 전처리 하기

이 글은 위키피디아에 존재하는 표 형태의 데이터를 전처리 하는 방법에 관한 기록입니다. 위키피디아에 존재하는 표 형태의 데이터를 크롤링 하는 방법에 관한 기록은 이 곳에서 볼 수 있습니다.

실습 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

댓글남기기