판다스 dataframe 완전 정복 — 파일 불러오기·인코딩·타입 변환 3단계

F1 레이스에서 이런 상황을 상상해보자. 피트월에 데이터는 쌓여 있다. 타이어 온도, 랩타임, 연료 잔량. 그런데 각 센서가 저장한 파일 형식이 제각각이다. CSV로 저장된 것, Excel로 정리된 것, Parquet으로 압축된 것. 파일을 열지 못하면 분석은 시작조차 할 수 없다. 판다스 dataframe은 바로 이 순간, 흩어진 데이터를 하나의 분석 가능한 구조로 모아주는 도구다.

판다스 dataframe은 파이썬에서 데이터를 행(row)과 열(column)로 다루는 핵심 자료구조다. 이 글에서는 CSV·Excel·Parquet 파일을 불러오는 방법부터, 인코딩 오류가 생기는 이유와 해결법, 데이터 타입 변환까지 3단계로 정리한다. 판다스 dataframe을 처음 접하는 엔지니어라면 이 글 하나로 파일 입출력의 전체 흐름을 잡을 수 있다.

판다스 dataframe이란 — 데이터를 다루는 기본 단위

판다스 dataframe은 엑셀 시트와 구조가 같다. 행과 열이 있고, 각 열마다 데이터 타입이 존재하며, 인덱스로 행을 식별한다. 차이는 하나다. 코드로 제어할 수 있다는 것.

현장에서 장비 로그를 엑셀로 열어 수작업으로 필터링하던 작업을 판다스 dataframe으로 옮기면, 같은 작업을 코드 몇 줄로 자동화할 수 있다. 파일 형식에 관계없이 데이터를 읽어오고, 가공하고, 저장하는 전 과정이 판다스 dataframe 안에서 일어난다.

판다스를 사용하기 전 아래 한 줄로 임포트한다.

import pandas as pd

CSV 불러오기 — 인코딩 오류가 생기는 3가지 이유와 해결법

CSV 파일을 불러오는 기본 코드는 간단하다.

df = pd.read_csv('data/파일명.csv')

그런데 한글이 포함된 CSV를 불러오면 아래 오류를 자주 만난다.

UnicodeDecodeError: 'utf-8' codec can't decode byte ...

이 오류가 생기는 이유는 인코딩 때문이다.

인코딩이란 무엇인가

인코딩은 문자를 컴퓨터가 저장할 수 있는 숫자(비트)로 변환하는 약속이다. “가”라는 글자 하나도 어떤 약속으로 저장했느냐에 따라 전혀 다른 숫자열로 기록된다. 저장할 때 쓴 약속과 읽을 때 쓰는 약속이 다르면 — 오류가 발생한다.

판다스 dataframe은 기본값으로 UTF-8 방식을 사용한다. 하지만 한국 Windows 환경에서 저장된 CSV는 CP949(EUC-KR) 방식으로 저장된 경우가 많다. 이 두 방식이 충돌할 때 오류가 생긴다.

인코딩특징주로 사용되는 환경
UTF-8전 세계 표준. 영어·한글·일어 모두 표현 가능Python, Linux, 웹
CP949한국 Windows 전용 한글 처리 방식한국 Windows Excel

해결법 — encoding 파라미터 추가

# CP949로 저장된 CSV 불러오기
df = pd.read_csv('data/파일명.csv', encoding='cp949')

인코딩 방식을 모를 때는 chardet 라이브러리로 추정할 수 있다.

import chardet

with open('data/파일명.csv', 'rb') as f:
    result = chardet.detect(f.read())
print(result)

100% 정확하지는 않지만, UTF-8인지 아닌지 정도는 판별할 수 있다. CSV 파일 내 데이터는 가능하면 영문으로 작성하는 것이 인코딩 문제를 원천 차단하는 가장 확실한 방법이다.

구분자(delimiter) 변경

CSV의 구분자가 콤마(,)가 아닌 경우 sep 파라미터로 변경한다.

# 구분자가 탭(tab)인 경우
df = pd.read_csv('data/파일명.csv', sep='\t', encoding='cp949')

Excel·Parquet 불러오기 — 파일 형식별 핵심 옵션

Excel 불러오기

df = pd.read_excel(
    'data/파일명.xlsx',
    sheet_name='Sheet1',   # 불러올 시트 지정
    na_values=['NA', 'N/A']  # NA로 처리할 문자열 지정
)

Excel 파일에서 빈 셀이나 NA 문자열을 결측값으로 처리하고 싶을 때 na_values를 활용한다. 지정하지 않으면 “NA”라는 문자열 그대로 인식해버려서 이후 분석에서 예상치 못한 오류가 생길 수 있다.

Parquet 불러오기

Parquet은 압축된 바이너리 형식이다. 대용량 데이터를 다룰 때 CSV보다 읽기 속도가 빠르고 파일 크기도 작다.

df = pd.read_parquet('data/파일명.parquet', engine='fastparquet')

engine 파라미터로 압축 해제 방식을 지정한다. pyarrowfastparquet 두 가지가 있으며, fastparquet이 일반적으로 속도가 더 빠르다.

파일 저장

판다스 dataframe 작업이 끝나면 아래 함수로 저장한다.

# CSV 저장
df.to_csv('output/결과.csv', index=False)

# Excel 저장
df.to_excel('output/결과.xlsx', sheet_name='Sheet1', index=False)

# Parquet 저장
df.to_parquet('output/결과.parquet', engine='fastparquet')

index=False는 판다스가 자동 생성한 행 번호(인덱스)를 저장에서 제외하는 옵션이다. 생략하면 0, 1, 2… 인덱스 열이 파일에 함께 저장된다.

판다스 dataframe 파일 불러오기 인코딩 타입 변환 개념 인포그래픽

데이터 타입 변환 — float64와 float32, 숫자 뒤에 숨은 의미

판다스 dataframe을 불러오면 각 열의 데이터 타입이 자동으로 지정된다. 이 타입이 분석 의도와 맞지 않을 때 변환이 필요하다.

float64 vs float32 — 숫자 뒤의 의미

뒤에 붙는 숫자는 비트(bit) 수다. 해당 숫자를 저장하는 데 사용하는 메모리 크기를 의미한다.

타입비트 수메모리소수점 정밀도
float6464bit8 bytes약 15~16자리
float3232bit4 bytes약 7자리
int6464bit8 bytes정수
int3232bit4 bytes정수

데이터가 수백만 행이면 float64 대신 float32를 쓰는 것만으로 메모리가 절반으로 줄어든다. 소수점 정밀도가 크게 중요하지 않은 현장 센서 데이터나 머신러닝 입력값에서 자주 활용하는 이유다.

astype()으로 타입 변환

import numpy as np

# 단일 컬럼 타입 변환
df['컬럼4'] = df['컬럼4'].astype(np.float32)

# 여러 컬럼 동시 변환
df = df.astype({'컬럼1': 'int32', '컬럼3': 'float32'})

변환 후 타입이 제대로 바뀌었는지 확인하는 습관을 들이는 것이 좋다.

print(df.dtypes)

판다스 dataframe 기본 조회 — info·dtypes·index로 구조 파악하기

파일을 불러오면 바로 분석으로 넘어가기 전에 구조를 먼저 확인한다. 판다스 dataframe이 제공하는 조회 함수 3가지가 이 역할을 한다.

.info() — 전체 구조 한눈에

df.info()

출력 결과에서 확인할 수 있는 것들:

  • 전체 행(row) 수
  • 각 컬럼명과 데이터 타입
  • 결측값 여부 (Non-Null Count가 전체 행 수보다 적으면 결측값 존재)

.dtypes — 컬럼별 타입 확인

df.dtypes

타입 변환 전후를 비교할 때 가장 많이 쓰는 함수다. 판다스 dataframe을 처음 받았을 때 숫자 컬럼이 object(문자열)로 잡혀 있는 경우가 있는데, 이 함수로 바로 확인할 수 있다.

.index — 인덱스 구조 확인

df.index
# RangeIndex(start=0, stop=254, step=1)

기본값은 0부터 시작하는 RangeIndex다. 날짜 기반 인덱스나 커스텀 인덱스를 설정한 경우 이 함수로 구조를 확인한다.

핵심 요약

판다스 dataframe으로 데이터를 다루는 전체 흐름은 단순하다. 불러오고 → 구조를 확인하고 → 타입을 맞추고 → 저장한다.

단계함수핵심 포인트
파일 불러오기read_csv, read_excel, read_parquet인코딩·구분자·시트명 옵션 확인
구조 확인info(), dtypes, index행 수·타입·결측값 파악
타입 변환astype()메모리 최적화·분석 목적에 맞게
저장to_csv, to_excel, to_parquetindex=False 여부 확인

인코딩 오류는 대부분 한글이 포함된 CSV에서 발생한다. encoding='cp949'를 먼저 시도하고, 그래도 안 되면 chardet으로 인코딩을 추정하는 순서로 접근하면 대부분 해결된다.

[링크 제안]

판다스 dataframe의 연산이 빠른 이유는 내부가 numpy 배열로 이루어져 있기 때문이다.
구조를 더 깊이 이해하고 싶다면 이 글부터 읽어보자.

데이터를 불러왔다면 다음 단계는 원하는 행·열을 정확히 꺼내는 것이다.

pandas 공식 문서는 pandas 공식 사이트에서 확인할 수 있다.

FAQ

영문 데이터만 있는 CSV라면 기본값(UTF-8)으로 대부분 문제없이 불러와진다. 한글이 포함된 CSV, 특히 한국 Windows 환경에서 저장된 파일은 CP949로 저장된 경우가 많으므로 encoding='cp949'를 함께 지정하는 것이 안전하다.

소수점 정밀도가 줄어들기 때문에 미세한 차이가 생길 수 있다. 단순 집계나 시각화, 머신러닝 입력값 수준에서는 실질적인 영향이 없는 경우가 대부분이다. 금융 계산처럼 정밀도가 중요한 경우에는 float64를 유지하는 것이 맞다.

df.info()로 Non-Null Count를 보면 컬럼별 결측값 존재 여부를 한눈에 파악할 수 있다. 더 정확한 수치가 필요하면 df.isnull().sum()을 사용한다. 결측값 처리는 분석 방향에 따라 제거(dropna)하거나 대체(fillna)하는 방법을 선택한다.

관련 글 보기