python/data analysis

[Pandas] str.extract를 사용한 데이터 전처리 + 결측값 핸들링하기

danuri 2021. 8. 25. 20:32

 

사용 데이터

MovieLens 영화 데이터 -> ml-latest-small.zip -> movies.csv

https://grouplens.org/datasets/movielens/

 

import pandas as pd

movies = pd.read_csv('[파일 경로]/movies.csv', index_col='movieId')

 

 

 

 

 

판다스에서 문자열 관련 함수를 사용하거나 전처리를 하기 위해서는 str을 붙여주어야 한다.

 

그중 원하는 문자열을 추출하는 extract 함수에 대해 알아보겠다.

 

개봉연도 데이터 정제하기(데이터 전처리, Preprocessing)

movies 데이터의 title에서 괄호 ( ) 안의 연도 4자리를 추출하고 싶을 때, 정규 표현식을 사용하면 편리하다.

 

movies['year'] = movies['title'].str.extract('(\(\d\d\d\d\))')

str.extract('([정규표현식])') <- 바로 이 위치에 추출하고 싶은 문자열의 정규표현식을  대입하면 된다.

바로 숫자 4자리를 추출하지 않는 이유는 [Star Wars 1995]처럼 괄호 안의 연도가 아닌 title 자체에 숫자 4자리가 포함될 수도 있기 때문이다.

우선 (1995) 처럼 괄호를 포함한 연도를 추출하고,

 

movies['year'] = movies['year'].str.extract('(\d\d\d\d)')

추출한 year 컬럼에서 그 안의 연도를 다시 추출한다.

 

<결과>

 

year 컬럼이 정상적으로 추가되었다.

 

컬럼 목록 보기

movies['year'].unique()

어떤 데이터가 추출되었는지 중복 없이 확인할 수 있다.

 

<결과>

array(['1995', '1994', '1996', '1976', '1992', '1967', '1993', '1964',
       '1977', '1965', '1982', '1990', '1991', '1989', '1937', '1940',
       '1969', '1981', '1973', '1970', '1955', '1959', '1968', '1988',
       '1997', '1972', '1943', '1952', '1951', '1957', '1961', '1958',
       '1954', '1934', '1944', '1960', '1963', '1942', '1941', '1953',
       '1939', '1950', '1946', '1945', '1938', '1947', '1935', '1936',
       '1956', '1949', '1932', '1975', '1974', '1971', '1979', '1987',
       '1986', '1980', '1978', '1985', '1966', '1962', '1983', '1984',
       '1948', '1933', '1931', '1922', '1998', '1929', '1930', '1927',
       '1928', '1999', '2000', '1926', '1919', '1921', '1925', '1923',
       '2001', '2002', '2003', '1920', '1915', '1924', '2004', '1916',
       '1917', '2005', '2006', '1902', nan, '1903', '2007', '2008',
       '2009', '2010', '2011', '2012', '2013', '2014', '2015', '2016',
       '2017', '2018', '1908'], dtype=object)

 

결측값 핸들링하기

year의 목록을 보면 nan이라는 값이 끼어 있는 것을 확인할 수 있다. 이는 결측값으로서 연도가 없는 등의 여러 이유로 인해 연도를 추출할 수 없는 경우를 말한다.

 

데이터를 처리할 때는 이러한 결측값들을 따로 처리해주는 것이 매우 중요하다.

 

결측값 확인

# Not a Number, 결측치
movies[movies['year'].isnull()]

movies에서 year가 nan인 값만을 확인한다.

 

<결과>

 

결측값 처리

movies['year'] = movies['year'].fillna('2050')

year가 nan인 값들을 모두 2050으로 채운다.

2050 역시 해당 영화의 개봉연도는 아니지만 적어도 nan 값을 대체하는 것만으로 의미가 있다.