판다스에서 수치형 데이터로 변환할 때 to_numeric과 astype의 차이
데이터 분석에서 수치형 데이터는 중요한 역할을 차지합니다. 특히 판다스 라이브러리는 연산과 처리에 강점을 발휘하며, 이를 위해 비 수치형 데이터를 수치형으로 변환하는 작업은 데이터 정제 과정에서 자주 요구됩니다. 판다스는 이러한 변환을 위해 두 가지 함수를 제공합니다. astype과 to_numeric입니다.
이 두 함수는 겉보기에는 비슷한 기능을 수행하는 것처럼 보이지만, 실제로는 각기 다른 목적과 용도를 지니고 있습니다. astype 함수는 대부분의 자료형으로 변환을 지원하는 범용성을 갖추고 있고 수치형으로도 변환이 가능하지만, 모든 데이터가 해당 형식으로 변환할 수 있어야만 올바르게 작동합니다.
반면, to_numeric 함수는 더 유연하게 작동하여, 변환할 수 없는 데이터를 자동으로 NaN으로 처리하면서 변환할 수 있는 데이터만 수치형으로 변환해 줍니다. 이는 대규모 데이터 세트를 처리할 때 매우 유용합니다.
예를 들어 위 예시의 시리즈 s2에는 숫자로 변환할 수 없는 데이터인 '-'가 포함되어 있기에, s2 전체를 정수나 실수 자료형으로 변환하는 작업은 astype 함수로 수행할 수 없습니다. 이는 astype 함수가 변환하려는 모든 데이터가 적합한 형식이어야만 작동하기 때문입니다.
import pandas as pd
# 예시를 위해 시리즈 s1과 s2 생성
s1 = pd.Series(['1', '2', '3', '4'])
s2 = pd.Series(['1', '2', '3', '-'])
이럴 때는 to_numeric 함수를 사용하고 errors='coerce'를 입력하면, 변환할 수 있는 데이터는 수치형으로 변환되고 변환할 수 없는 데이터는 NaN으로 처리됩니다. 주의할 점은 to_numeric 함수는 메서드로 사용할 수 없고, 반드시 pd.to_numeric 함수로 호출해야 한다는 것입니다. 예를 들어 시리즈 s2를 수치형 데이터로 변환하는 코드는 다음과 같습니다.
pd.to_numeric(s2, errors='coerce')
0 1.0
1 2.0
2 3.0
3 NaN
dtype: float64
위 코드를 실행하면 '-'는 NaN으로 변환되며, 나머지 데이터는 수치형으로 변환됩니다. 필요할 경우 fillna 함수처럼 결측값을 처리하는 함수를 사용하여 NaN 값을 별도로 처리할 수 있습니다.
또한 to_numeric 함수는 데이터 프레임 전체에 직접 적용할 수 없고, 시리즈에만 함수를 적용할 수 있다는 점도 유의해야 합니다. 이 제한은 apply 함수를 사용하여 해결할 수 있으며, 다음 코드를 통해 df 전체에 to_numeric 함수를 적용할 수 있습니다.
# 예시 데이터 프레임 생성
data = {'col1': ['1', '-', '3', '4'], 'col2': ['1', '2', '-', '4']}
df = pd.DataFrame(data)
# apply 함수를 사용하여 데이터 프레임 전체에 to_numeric 함수 적용
df.apply(pd.to_numeric, errors='coerce')
astype 함수가 to_numeric 함수의 하위 호환은 아닙니다. 예를 들어, astype 함수는 실수(float) 자료형을 정수형으로 변환할 때 소수점을 단순히 없애는 방식으로 처리할 수 있습니다.
# 예시 시리즈 s3 생성
s3 = pd.Series([1.1, 2.3])
# astype 함수로 실수형 자료형을 정수로 변환
s3.astype('int')
표를 통해 astype 함수와 to_numeric 함수의 차이점을 정리할 수 있습니다. 상황에 맞게 사용한다면 두 함수 모두 유용합니다.
기능 | astype | to_numeric |
데이터 프레임에 적용 | O | apply 함수로만 가능하다. |
실수의 정수 변환 | O (소수점 이하 내림 처리) | X |
메서드 형태로 적용 | O | X |
변환할 수 없는 데이터 처리 | 에러 발생 | NaN으로 변환(errors='coerce') |
'판다스 > 중급 판다스' 카테고리의 다른 글
[pandas] 특정 열의 값을 기준으로 행을 선택하는 방법 (0) | 2024.05.22 |
---|---|
[pandas] 영업일(business day)을 배열로 생성하는 방법 (0) | 2023.08.28 |
[pandas] 멀티 인덱스에서 특정 값 수정하기 (0) | 2023.08.23 |
[pandas] 범주형 데이터를 정수로 코드화하는 다양한 방법 (0) | 2023.05.27 |
[pandas] 시리즈에 apply 대신 map 함수로 매핑하는 이유 (0) | 2023.05.27 |