728x90
실제 데이터를 다루다 보면 이런 경험, 한 번쯤 해봤을 것이다:
- 숫자인 줄 알았는데 문자열(object)이라 연산이 안 된다
- 날짜인 줄 알았는데 그냥 문자열이라 정렬이 이상하게 나온다
- 정수로 보여도 float64라 데이터 저장 용량이 크다
이처럼 Pandas에서 데이터 타입이 올바르지 않으면 연산 오류, 성능 저하, 분석 왜곡 등 수많은 문제가 발생할 수 있다.
예제 데이터
import pandas as pd
df = pd.DataFrame({
'user_id': ['1001', '1002', '1003'],
'age': ['25', '30', '35'], # 문자열로 들어온 숫자
'score': [88.0, 92.5, 85.0],
'signup_date': ['2023-01-01', '2023-02-15', '2023-03-20']
})
데이터 타입 확인 – .dtypes
df.dtypes
→ 숫자인 age도 문자열로 들어왔고, signup_date도 날짜가 아닌 문자열 상태임을 확인
타입 변환 – .astype()
문자열 숫자를 정수형으로
df['age'] = df['age'].astype(int)
→ object → int64로 변환
정수형을 문자열로
df['user_id'] = df['user_id'].astype(str)
→ 숫자를 고유 ID 문자열로 유지하고 싶을 때 사용
float → int (주의)
df['score'].astype(int) # 92.5 → 92로 소수점 절삭됨
→ 정수로 바꾸면 반올림 없이 내림이므로 주의
날짜 문자열을 datetime 타입으로
df['signup_date'] = pd.to_datetime(df['signup_date'])
→ object → datetime64[ns]
- datetime 타입으로 바꾸면 dt.year, dt.month, dt.day, dt.weekday() 등 다양한 속성 사용 가능
범주형 데이터로 변환 – astype('category')
df['user_type'] = ['basic', 'premium', 'basic']
df['user_type'] = df['user_type'].astype('category')
- 저장 공간 절약 (특히 반복되는 값이 많을 때 효과적)
- .cat.codes로 정수 라벨 매핑 가능
주의사항
숫자처럼 보이는 문자열은 꼭 변환해줘야 한다
df['age'].mean() # object이면 오류 발생
→ .astype(int)로 먼저 변환하지 않으면 수치 계산 불가
astype() 실패 예외 처리하기
df['age'] = pd.to_numeric(df['age'], errors='coerce')
→ 변환 실패 시 NaN으로 처리 (에러 방지용)
예제: 초기 로딩 시 타입 지정
df = pd.read_csv('data.csv', dtype={'user_id': str, 'age': int})
→ 데이터가 처음부터 잘못 들어오는 것을 사전에 차단할 수 있음
Pandas에서 데이터 타입 관리는 선택이 아닌 필수다.
정확한 타입을 지정해야만, 연산 오류 없이 빠르고 안정적인 분석이 가능하다.
dtypes로 현재 상태를 확인하고,
astype(), to_datetime(), to_numeric() 등으로 상황에 맞는 변환을 해주는 습관을 들어야합니다.
728x90
반응형
'python > Pandas | Numpy' 카테고리의 다른 글
[Pandas] filter() (0) | 2025.04.24 |
---|---|
[Pandas] 조건 조합 필터링 및 추출 (0) | 2025.04.24 |
[Pandas] 결측치(NaN) 처리 (0) | 2025.04.24 |
[Pandas] 정렬과 순위 매기기 – sort_values, rank (0) | 2025.04.24 |
[Pandas] Boolean Indexing (조건 필터링) (0) | 2025.04.24 |