데이터분석 공부/DSBA 4기

파이썬 데이터프레임 특정 문자 포함된 행 삭제하기 / str.replace() 추천하지 않는 경우

이삼오 2024. 3. 9. 17:20

 

1. str.replace( ) 추천하지 않는 경우

파이썬에서 데이터프레임 속 문자열 데이터를 변경(대체)할 때 주로 str.replace 메서드를 사용한다. 

오늘은 이 메서드를 사용하면 안 되는 경우에 대해 알아보겠다. 

 

아래는 UCI 머신러닝 저장소에서 제공하는 자동차 연비 데이터(auto mpg data)로

연비, 실린더 수, 배기량, 출력, 차종, 가속능력, 출시년도, 제조국, 모델명 정보를 담고 있다. 

 

 

 

car_name을 제외한 컬럼들은 숫자형 데이터로 보이지만

df.info( )로 데이터 타입을 확인해보면 horse_power 컬럼이 object 타입임을 알 수 있다. 

 

 

car_names를 제외한 컬럼들을 계산이 가능한 데이터 타입으로 변경하려 한다. 

horsepower 컬럼에는 소수점이 있는 숫자형 데이터가 있으니 데이터 타입을 float로 바꾸면 좋을 것 같다.

astype() 메서드를 사용했으나 ValueError가 발생했다. 

 

ValueError: could not convert string to float: '?'

Output is truncated. View as a scrollable element or open in a text editor. Adjust cell output settings...

 

에러 메시지를 확인해보면 '?' 라는 string 데이터를 float 타입으로 변경할 수 없다는 내용이다. 

데이터 수가 많지 않으니 unique() 메서드로 어떤 데이터가 있는지 확인해봤다. 

 

 

 

데이터 중 '?' 데이터가 하나 존재한다.

이 때 '?' 데이터를 없애기 위해 str.replace() 메서드를 사용하면 어떻게 될까?

 

기존 데이터를 변경시키지 않기 위해df_hp라는 데이터프레임을 새로 만들고

df_hp['horsepower'] 컬럼에 str.replace('?', '') 를 사용해봤다. 

astype() 메서드를 적용시키려 했지만 또 다시 에러가 발생했다. 

 

ValueError: could not convert string to float: ''

Output is truncated. View as a scrollable element or open in a text editor. Adjust cell output settings...

 

'?' 데이터가 ''으로 바뀌었지만 string data를 float로 변경할 수 없다는 내용은 동일하다. 

다시 한 번 unique() 메서드로 데이터를 확인해보자. 

 

 

 

에러 메시지 내용처럼 '?' 데이터가 빈값으로 바뀌었다. 

이렇듯 데이터에 특정 문자만 존재할 때는 처리할 단계가 하나 늘어나므로 str.replace() 메서드를 추천하지 않는다. 

(이전 글에서 사용한 pop_seoul 데이터는 ',' 를 공백으로 대체해도 정수 데이터가 존재해서 이 문제가 발생하지 않았다.)

 

 

빈 데이터를 처리하는 방법은 다양하다.

임의의 값으로 대체하거나 결측치가 포함된 행을 삭제하는 등 여러 선택을 할 수 있다.

auto mpg data에서 horsepower 데이터의 영향을 잘 모르므로 해당 행을 삭제하기로 했다. 

 

2. dropna( ) 

df_hp = df_hp.dropna()
df_hp.info()

 

dropna( ) 메서드로 결측치가 포함된 행을 제거했다. 

398개이던 데이터 수가 392으로 줄어들었다. 

 

 

print(df_hp['horsepower'].unique())
print('\n')
df_hp['horsepower'].astype(float)

 

unique() 로 다시 한 번 확인해보니 horsepower 컬럼에 있던 빈값이 삭제되었다. 

결측치를 제거한 데이터에 astype 메서드를 적용시키자 오류 없이 데이터 타입이 변경된다. 

 

3. srt.contains( ) 후 drop( )

기존의 데이터프레임에서 '?' 데이터가 포함된 행을 삭제하기 위해서는 drop을 사용하면 된다. 

idx = df[df['horsepower'].str.contains('\?')].index
df_hp2 = df.drop(idx)

 

horsepower 컬럼 속 '?' 문자열이 포함된 데이터를 찾아 데이터프레임을 만들고 idx라는 변수에 할당했다. 

df 데이터프레임에서 idx를 drop(삭제)하고 df_hp2 라는 새로운 데이터프레임에 저장했다. 

 

이 때 '?' 는 특수문자이므로 '\?'로 작성해야 한다. 

'?' 로 작성할 경우 아래와 같은 오류가 발생한다. 

error: nothing to repeat at position 0

 

 

4. 비교 연산자

비교 연산자를 사용하면 코드가 더욱 간결해진다. 

df_hp3 = df[df['horsepower'] != '?']
df_hp3['horsepower'].astype(float)

 

비교 연산자 != 를 사용하면 특정 문자와 동일하지 않은 데이터만 반환한다. 

만약 특정 문자를 포함한 데이터를 삭제하고 싶다면 이 코드는 사용할 수 없다.