[판다스 15화] 데이터 타입 변환하기: astype, to_datetime, to_numeric 활용법 | Python Pandas | 빅분기, 빅데이터분석기사 실기

파이썬(Python) 판다스(Pandas) 라이브러리를 활용해 데이터를 다룰 때, 각 열(Column)의 데이터 타입을 올바르게 설정하는 것은 데이터 전처리의 기본이자 필수적인 단계입니다. 숫자로 계산되어야 할 매출액 데이터가 문자열(object)로 저장되어 있거나, 범주형 변수가 분석 목적에 맞지 않는 잘못된 타입으로 지정되어 있다면 통계량 산출이나 머신러닝 모델 학습 과정에서 논리 오류가 발생할 수 있습니다.

특히 빅데이터분석기사(빅분기) 실기 시험이나 현업의 데이터 파이프라인 구축 환경에서는 데이터 형 변환 오류를 사전에 감지하고 교정하는 능력이 요구됩니다. 이번 글에서는 판다스의 대표적인 데이터 타입 변환 도구인 astype(), pd.to_datetime(), pd.to_numeric()의 활용법을 비즈니스 가상 데이터 예시와 함께 체계적으로 살펴보겠습니다.

1. 전반적인 데이터 형 변환의 기본: astype() 함수

astype() 메서드는 데이터프레임의 특정 열을 원하는 데이터 타입으로 강제 변환할 때 가장 보편적으로 사용하는 도구입니다. 정수형, 실수형, 문자열, 범주형 등으로 유연하게 변환할 수 있습니다.

1.1. astype()의 기본 사용법과 비즈니스 예시

가상의 고객 정보 데이터프레임을 통해 astype()의 동작을 살펴보겠습니다.

import pandas as pd

# 가상 고객 데이터 생성
customer_df = pd.DataFrame({
    '고객번호': [1001, 1002, 1003, 1004],
    '나이': ['23', '31', '45', '28'],
    '구매여부': [1, 0, 1, 1]
})
print(customer_df.dtypes)

초기 데이터 상태에서 ‘나이’는 문자열(object)로, ‘구매여부’는 정수형(int64)으로 인식되어 있습니다. 수학적 연산이나 메모리 최적화를 위해 이를 변환해 보겠습니다.

# 1. '나이' 컬럼을 정수형(int)으로 변환
customer_df['나이'] = customer_df['나이'].astype(int)

# 2. '구매여부' 컬럼을 논리형(bool)으로 변환
customer_df['구매여부'] = customer_df['구매여부'].astype(bool)

# 3. 딕셔너리를 활용해 여러 열을 한 번에 변환
customer_df = customer_df.astype({'고객번호': str, '나이': float})

1.2. 범주형(Category) 변환을 통한 메모리 최적화

현업에서 ‘성별(남/여)’이나 ‘등급(Gold/Silver/Bronze)’과 같이 고유한 범주의 개수가 제한된 문자열 데이터는 astype('category')로 변환하는 편이 효율적입니다. 문자열 범주 데이터를 category 타입으로 관리하면 메모리 사용량을 줄이고, 그룹 연산이나 일부 데이터 처리 과정에서 효율성을 높일 수 있습니다.

2. 날짜 시간 포맷 전용 변환: pd.to_datetime()

지난 14화에서 상세히 다룬 것처럼, 날짜와 시간 정보가 문자열로 적재되어 있을 때는 astype()보다 pd.to_datetime() 함수를 사용하는 것이 적절합니다.

2.1. pd.to_datetime()의 특징과 강점

astype(datetime64)을 사용할 수도 있으나, pd.to_datetime()은 다양한 형식의 구분자(대시, 슬래시, 마침표)를 스스로 해석하는 파싱 기능이 내장되어 있어 안정성이 높습니다.

# 문자열 날짜 데이터를 datetime64 형태로 변환
order_dates = ['2026-07-01', '2026/07/02', '2026.07.03']
datetime_series = pd.to_datetime(order_dates)

변환이 완료되면 데이터프레임 내부에서 연, 월, 일 단위의 시계열 추출 및 기간 뺄셈 연산(Timedelta)이 가능해집니다.

3. 수치형 데이터 예외 처리의 핵심: pd.to_numeric()

수치형 변환을 시도할 때 astype(int)이나 astype(float)은 문자열 내부에 숫자가 아닌 문자(예: 공백, 쉼표, 알파벳)가 단 하나라도 섞여 있으면 ValueError를 발생시키며 작동을 멈춥니다. 이러한 한계를 보완하기 위해 설계된 함수가 바로 pd.to_numeric()입니다.

3.1. errors 파라미터를 활용한 예외 제어

pd.to_numeric()의 가장 큰 장점은 errors 파라미터를 통해 데이터 정제 방식을 세부적으로 제어할 수 있다는 점입니다.

  • errors=’raise’: 변환할 수 없는 문자가 발견되면 에러를 발생시킵니다. (기본값)
  • errors=’ignore’: 변환할 수 없는 문자가 있으면 변환을 수행하지 않고 원본 데이터를 그대로 반환합니다.
  • errors=’coerce’: 변환이 불가능한 문자를 결측치인 NaN(Not a Number)으로 강제 변환합니다.

3.2. 비즈니스 실무 정제 예시

매출 데이터나 실적 표를 정리하다 보면 숫자가 누락되어 ‘미집계’ 등의 텍스트가 섞이는 경우가 많습니다.

# 특수문자와 텍스트가 섞인 가상 매출 데이터
raw_sales = pd.Series(['15000', '23000', '미집계', '42000', '보류'])

# errors='coerce'를 사용하여 숫자가 아닌 요소를 결측치로 처리
clean_sales = pd.to_numeric(raw_sales, errors='coerce')
print(clean_sales)

[출력 결과]

0    15000.0
1    23000.0
2        NaN
3    42000.0
4        NaN
dtype: float64

errors='coerce'를 적용하면 비정상적인 텍스트가 NaN으로 매끄럽게 변환됩니다. 이후 11화에서 배운 fillna()를 연계하여 중앙값이나 0으로 결측치를 메우면, 데이터 파이프라인의 중단 없이 수치형 통계 연산을 이어 나갈 수 있습니다.

4. 빅데이터분석기사 실기 시험 환경에서의 실전 활용 포인트

빅데이터분석기사 실기(작업형 제1유형 및 제2유형) 환경에서는 수집된 데이터의 형태를 표준 포맷으로 다듬는 알고리즘 설계 능력을 평가합니다.

4.1. 수치형 피처의 텍스트 기호 정제 가이드

공공데이터나 기업 제공 파일 중 금액 변수에 쉼표(,)가 들어가 문자열(object)로 오인되는 케이스가 빈번하게 출제됩니다. 이 경우 아래와 같은 2단계 전처리 프로토콜을 준수하는 편이 안전합니다.

# [실전 적용 예시]
# 1. str.replace를 통해 쉼표 기호 우선 제거
X_train['매출액'] = X_train['매출액'].str.replace(',', '')

# 2. pd.to_numeric과 errors='coerce'를 결합하여 안전하게 실수형 변환
X_train['매출액'] = pd.to_numeric(X_train['매출액'], errors='coerce')

4.2. 독립변수와 종속변수의 타입 검증

분류(Classification) 알고리즘을 수행할 때, 종속변수(y)는 모델과 평가 방식에 따라 적절한 형태로 관리해야 합니다. 일부 알고리즘이나 평가 과정에서는 문자열 라벨을 지원하지 않거나 추가적인 인코딩이 필요할 수 있으므로, 학습 전 데이터 타입과 값의 형태를 반드시 확인해야 합니다.

따라서 모델 학습 직전 df.dtypes 또는 df.info()로 타입을 최종 점검한 뒤, 타깃 변수를 astype(int) 또는 인코딩 과정을 거쳐 문제 유형에 맞는 적절한 데이터 타입으로 변환해 주는 습관이 실점 확률을 낮추는 지름길입니다.

5. 요약 및 다음 화 안내

  • astype(): 전반적인 데이터 타입을 정수, 실수, 문자열, 범주형(category) 등으로 일괄 변환하며 복수 컬럼 동시 적용이 가능합니다.
  • pd.to_datetime(): 시계열 분석을 위해 날짜 형식의 문자열이나 날짜 표현 데이터를 datetime64 타입으로 변환하여 시계열 연산이 가능하도록 합니다.
  • pd.to_numeric(): 수치 변환 과정에서 유실된 불순물 텍스트가 발견되었을 때 errors='coerce' 옵션을 통해 NaN으로 안전하게 격리 처리합니다.

다음 [판다스 16화]에서는 단일 컬럼의 단순 변환을 넘어, 커스텀 함수나 매핑 딕셔너리를 활용해 전체 행 데이터를 입체적으로 변환하는 고급 가공 기술인 apply, map, applymap 차이점과 실무 활용법에 대해 상세히 알아보겠습니다. 데이터프레임 제어 마스터를 위한 다음 단계를 함께 준비해 봅시다.

댓글 남기기