본문 바로가기

카테고리 없음

[Pandas] DataFrame의 문자열 칼럼을 숫자형으로 변환 : pd.to_numeric / DataFrame.astype() / replace

반응형

(1) replace를 적용한 함수 정의(def)

(2) pd.to_numeric() 함수를 이용한 문자열 칼럼의 숫자형 변환

(3) astype() 메소드를 이용한 문자열 칼럼의 숫자형 변환

 

 

 

(1) replace를 적용한 함수 정의(def)

(1-1) 기호가 포함되어있는 문자열 숫자형으로 변환하는 함수 정의

# 23,500 형태의 문자 숫자로 변환하기 

def 
toint(string):
return int(string.replace(',', '')) # 자료형 변환 함수 설정 String - > int

df['열이름'] = df['열이름'].apply(toint) # Value 속 자료가 string 인걸 확인해서 ',' 를 지우고 int로 바꿔주는 함수 대입

df.dtypes

 

 

 

 

 

 

 

(2) pd.to_numeric() 함수를 이용한 문자열 칼럼의 숫자형 변환

(2-1) 한개의 문자열 칼럼을 숫자형으로 바꾸기

import numpy as np
import pandas as pd

# make a DataFrame
df = pd.DataFrame({'col_str': ['1', '2', '3', '4', '5']})
df

# check data types 
df.dtypes

df['col_int'] = pd.to_numeric(df['col_str'])
df

df.dtypes

 

(2-2) apply() 함수와 to_numeric() 함수를 사용해 DataFrame 내 다수의 문자열 칼럼을 숫자형으로 바꾸기

# make a DataFrame with 3 string columns
df2 = pd.DataFrame({'col_str_1': ['1', '2', '3'], 
                   'col_str_2': ['4', '5', '6'], 
                   'col_str_3': ['7.0', '8.1', '9.2']})

df2

df2.
dtypes



# convert 'col_str_1' and 'col_str_2' to numeric
df2[['col_int_1', 'col_int_2']] = df2[['col_str_1', 'col_str_2']].apply(pd.to_numeric)
df2

df2.dtypes



# convert all columns of a DataFrame to numeric using apply() and to_numeric together

df3 = df2.apply(pd.to_numeric)
df3.dtypes



 

 

(3) astype() 메소드를 이용한 문자열 칼럼의 숫자형 변환

(3-1) DataFrame 내 모든 문자열 칼럼을 float로 한꺼번에 변환하기



df4 = pd.DataFrame({'col_str_1': ['1', '2', '3'], 
                   'col_str_2': ['4.1', '5.5', '6.0']}) 


df4.dtypes




df5 = df4.astype(float)
df5




df5.dtypes

 

(3-2) DataFrame 내 문자열 칼럼별로 int, float 데이터 형식 개별 지정해서 숫자형으로 변환하기



df6 = df4.astype({'col_str_1': int
                  'col_str_2': np.float})


df6




 df6.dtypes


 

 

  DataFrame에 문자가 포함된 칼럼이 같이 있을 경우, 개별적 선택으로 ValueError해결하기

물론 DataFrame 내의 문자열 중에서 숫자가 아니라 문자(character)로 이루어진 문자열(string)이 포함되어 있을 경우 apply(pd.to_numeric) 함수나 DataFrame.astype(int) 메소드를 써서 한꺼번에 숫자형 데이터 형태로 변환하려고 하면 ValueError 가 발생합니다. 

 

이럴 때는 숫자만 들어있는 문자열 칼럼만을 선택해서 개별적으로 변환을 해주면 됩니다. 

 

아래는 문자로만 구성된 문자열 'col_2' 를 포함한 df7 데이터프레임을 만들어서 전체 칼럼을 숫자형으로 바꾸려고 했을 때 ValueError 가 발생한 예입니다. 

df7 = pd.DataFrame({'col_1': ['1', '2', '3'], 
                   'col_2': ['aaa', 'bbb', 'ccc']})

df7
df7.dtypes 

 

* ValueError

 # ValueError
df7 = df7.apply(pd.to_numeric)

 

 

* ValueError

# ValueError
df7 = df7.astype(int)
ValueError: invalid literal for int() with base 10: 'aaa' 

 

 

 문자열을 숫자형으로 변환 시 ValueError 를 무시하기: df.apply(pd.to_numeric, errors = 'coerce') 

 

위의 예와는 조금 다르게 문자형을 숫자형으로 변환하려는 칼럼이 맞는데요, 값 중에 몇 개가 실수로 숫자로 된 문자열이 아니라 문자로 된 문자열이 몇 개 포함되어 있다고 해봅시다. 이럴 경우 문자열을 숫자로 파싱할 수 없다면서 ValueError가 발생하는데요, 문자가 포함되어 있는 경우는 강제로 'NaN'으 값으로 변환하고, 나머지 숫자로된 문자열은 숫자형으로 변환해주려면 errors = 'coerce' 옵션을 추가해주면 됩니다. 

 

df8 = pd.DataFrame({'col_1': ['1', '2', '3'], 
                   'col_2': ['4', 'bbb', '6']})
df8


df8 = df8.apply(pd.to_numeric)


df8 = df8.apply(pd.to_numeric, errors = 'coerce')
df8

 


출처: https://rfriend.tistory.com/470 [R, Python 분석과 프로그래밍의 친구 (by R Friend)]

반응형