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 파라미터로 압축 해제 방식을 지정한다. pyarrow와 fastparquet 두 가지가 있으며, 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… 인덱스 열이 파일에 함께 저장된다.
데이터 타입 변환 — float64와 float32, 숫자 뒤에 숨은 의미
판다스 dataframe을 불러오면 각 열의 데이터 타입이 자동으로 지정된다. 이 타입이 분석 의도와 맞지 않을 때 변환이 필요하다.
float64 vs float32 — 숫자 뒤의 의미
뒤에 붙는 숫자는 비트(bit) 수다. 해당 숫자를 저장하는 데 사용하는 메모리 크기를 의미한다.
| 타입 | 비트 수 | 메모리 | 소수점 정밀도 |
|---|---|---|---|
| float64 | 64bit | 8 bytes | 약 15~16자리 |
| float32 | 32bit | 4 bytes | 약 7자리 |
| int64 | 64bit | 8 bytes | 정수 |
| int32 | 32bit | 4 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_parquet | index=False 여부 확인 |
인코딩 오류는 대부분 한글이 포함된 CSV에서 발생한다. encoding='cp949'를 먼저 시도하고, 그래도 안 되면 chardet으로 인코딩을 추정하는 순서로 접근하면 대부분 해결된다.
[링크 제안]
판다스 dataframe의 연산이 빠른 이유는 내부가 numpy 배열로 이루어져 있기 때문이다.
구조를 더 깊이 이해하고 싶다면 이 글부터 읽어보자.
데이터를 불러왔다면 다음 단계는 원하는 행·열을 정확히 꺼내는 것이다.
pandas 공식 문서는 pandas 공식 사이트에서 확인할 수 있다.







