[pandas] 데이터 전처리 – 문자열 인덱싱, 파싱

지난 포스팅에 이어서 파이썬 pandas로 데이터 전처리하는 방법을 소개한다.

1. 문자열 인덱싱해서 열 생성하기 (.str)

예를 들면 아래와 같이 데이터에 생년월일 같은 열이 있는 경우

‘년’, ‘월’, ‘일’이라는 별도의 열로 쪼개고 이렇게 싶다면

.str을 사용할 수 있다.

df["month"]=df["birthday"].str[4:6]
df["day"]=df["birthday"].str[6:]
df["year"]=df["birthday"].str[:4]

역시 파이썬은 직관적이라 나처럼 무식한 사람도 쉽게 시도할 수 있다.

2. 문자열 쪼개서 열 생성하기 (.str.split(), .str.get())

만약 영문이름 full name에서 이름과 성을 띄어쓰기(공백)으로 분리해서 각각 다른 열에 저장하고 싶다고 해보자.

일단 데이터가 이렇게 생겼다면

일단 full_name 열에 .str.split()을 사용해서 pandas의 Series 형태로 저장해놓고, .str.get()을 통해 불러와서 각각의 열에 저장하면 된다.

name_split = df["full_name"].str.split(" ")

df["first_name"] = name_split.str.get(0)
df["last_name"] = name_split.str.get(1)

간단하다.

3. 데이터 타입 object에서 숫자로 변환하기 (pd.to_numeric())

데이터를 확인할 때 처음에 df.info()df.dtypes를 찍어보면 각 열에 포함된 데이터의 속성을 확인할 수 있다. 그런데 이 때 간혹 숫자로 입력되어야 분석이 가능한 열이 그냥 객체(object)로 들어가 있는 경우가 있다.

예를 들면 이런 데이터프레임에서 df.dtypes을 확인해봤더니

이렇게 price, 가격 열이 그냥 object로 들어가 있다고 해보자.

이럴 땐 일단 앞에 있는 ‘$’ 문자 같은 걸 삭제해준 후 (문자열 파싱에 대한 자세한 설명은 뒤에서 좀 더…)

pd.to_numeric()을 활용해서 타입을 숫자로 변환한다.

df["price"] = df["price"].replace('[\$,]', '', regex=True)
df["price"] = pd.to_numeric(df["price"])

*** 문자열 파싱(정규표현식) 심화 연습

사실 규칙을 바탕으로 문자열을 정교하게 다루려면 ‘정규표현식’에 대해 좀 공부를 해야 하는데, 어려워서 나도 잘은 모른다. 어쨌든 아주 쉽고 간단한 예제만 하나 더 소개하자면.

일단 아래와 같이 특정 날짜에 어떤 운동을 몇 회 했는지 기록해놓은 데이터프레임이 있다고 하자.

exerciseDescription이라는 열을 보면 운동의 종류, 몇 회 했는지, 그리고 “reps”라는 단어가 들어 있다.는 문자가 들어가 있다.

일단 .str.split()를 사용해 문자열를 쪼개야 하는데, 여기서 정규표현식이 등장한다. (\d+)는 0-9까지 숫자가 1회 이상 반복된다는 뜻이고, 어쨌든 숫자가 등장하면 그걸 기준으로 쪼개도록 한다면 이렇게 쓸 수 있다.

split_df = df['exerciseDescription'].str.split('(\d+)', expand=True)

새로 생성한 split_df를 찍어보면 아래와 같다.

split_df를 보면 숫자는 1번 열에 잘 들어와 있는데, 타입이 문자열이다. 이걸 숫자로 바꿔주려면 위에서 배운 pd.to_numeric()을 사용하면 된다. 숫자로 바꿔서 원래 데이터프레임 df에 넣어주자.

df["reps"] = pd.to_numeric(split_df[1])

그 다음 split_df를 다시 보면 0번 열에는 운동 종류가 들어와 있는데 뒤에 ” – “가 붙어 있어서 지저분하다. 이걸 지우려면 다시 정규표현식을 활용해야 한다. 어쨌든 깔끔하게 바꿔서 원래 df에 잘 넣어보자.

df["exercise"] = split_df[2].replace('[\- ]', '', regex=True) 

다시 df를 찍어보면 이렇게 잘 들어가 있는 걸 확인할 수 있다.


더러운 데이터들은 결국 문자열을 잘 다룰 줄 알아야 한다. 그러려면 정규표현식을 자유롭게 사용해야 하는데… 사실 나도 잘 모른다. 일단 어려움.

아무튼 최대한 쉬운 거부터, 내가 해결해야 하는 것들부터 하나씩 해보자.

추천 글

댓글 남기기