[pandas] 문자열 값을 숫자로 변환

cs2tree·2023년 2월 14일
0

판다스를 이용해서 텍스트 데이터 전처리를 하던 중 하나의 열(레이블)의 타입을 숫자로 바꾸고 싶었다.

처음 코드는

dataset = dataset.astype({'label':'int'})

를 사용했다. 그런데 몇 개 행에서 숫자로 바꿀 수 없는 데이터가 있었다. 예를 들면 '/8'과 같은...

이런 데이터를 어떻게 처리하지 하고 고민하다가 아래 방법을 찾았다.

temp = dataset.to_numeric(dataset['label'].str.replace("/","")
dataset = pd.concat([dataset.["input"], temp], axis=1)

이 코드의 의미를 하나하나 살펴보았다.

  • 여기에서 df.to_numercie(series)는 df의 한 열(series)의 원소들을 전부 숫자로 바꾸겠다는 뜻이다.
  • series.str 은 시리즈인 data['label']의 string원소들을 벡터화하면서 불러오겠다는 뜻인 것 같다...

Series.str 이 개념이 조금 어려웠다. 판다스 공식 홈페이지 문서를 보니 'Vectorized string functions for Series and Index.'이라고 되어 있었다. 이 내용과 위 쓰임새를 합쳐서 이해하면 문자열 데이터를 벡터화에서 가져오는데, Series 자체가 아니라 Series의 각 str 원소들를 가져오겠다는 뜻으로 이해했다. 지금은 아리송하지만 앞으로 마주쳐나가면서 좀 더 이해할 수 있을 것 같다.

  • .replace("str1", "str2")는 str1의 경우 전부 str2로 바꾸겠다는 뜻이다.

+) 추가적으로...

string인 열을 숫자로 바꿀 수 있는 방법들을 소개한다.

1. pd.numeric() 사용

new_col = pd.numeric(df.["바꾸고 싶은 열 이름"])

여기서 몇몇 행의 값이 문자가 속해 있어서 숫자열로 바꿀 수 없는 경우에는 해당 문자를 ""로 replace해서 없애준다.

new_col = pd.numeric(df.["바꾸고 싶은 열 이름"].str.replace("문자"), "")

이 방법으로 하면 문자가 속한 행을 날려버리지 않고도 예외처리를 할 수 있다. 그래서 가장 좋은 방법이라고 생각한다.

2. df.astype() 사용

dataset = dataset.astype({'label':'int'})

이 경우 판다스 공식 홈페이지 문서를 살펴보니 에러처리를 할 때,
errors={'raise','ignore'} 밖에 없다. 에러를 띄우거나, 무시하거나 일 뿐 에러가 나는 행에 대해서 조치를 취할 수 없다.

3. pd.apply() 사용

pd.apply(pd.numeric, args=({"errors": "coerce"}) 

을 통해서 에러처리를 할 수 있다. erros에 대한 옵션은 raise, ignore, coerce가 있고 coerce는 에러가 난 행(의 원소)를 NaN 처리하는 것이다.

이후 drop.na()를 통해서 숫자로 변형되지 못하는 행을 처리할 수 있지만, 데이터가 일부 소실되는 문제가 있다. 그래서 1번 replace하는 것보다 별로인듯...

이렇게 하나하나 배워가면서
판다스에 대해 정복해나가자!!!! 예이!!!!

profile
___호기심 많은 씨앗___ 씨앗이 나무가 될 때까지 :D

0개의 댓글