pandas 전처리는 대부분 read_csv로 시작해 to_parquet/to_csv로 끝납니다.
read_csv는 옵션이 수십 개지만, 실무에서 반복적으로 쓰는 것은 dtype, parse_dates, na_values, usecols, nrows/chunksize, encoding 정도입니다.
"읽을 때 형을 제대로 지정"하는 것이 이후 모든 정제 비용을 줄입니다.
import pandas as pdread_csv 핵심 옵션df = pd.read_csv(
"sales.csv",
dtype={"user_id": "Int64", "category": "category"}, # 열별 형 지정
parse_dates=["order_date"], # 날짜 파싱 (datetime64로)
na_values=["", "N/A", "-", "null"],# 결측으로 취급할 문자열
usecols=["order_date", "user_id", "amount", "category"], # 필요한 열만
encoding="utf-8", # 한글 깨지면 "cp949" 시도
thousands=",", # "1,234" → 1234
dtype_backend="numpy_nullable", # 결측 안전한 확장 dtype로 (pandas 2.0+)
)💡 이럴 때: 파일이 크면 먼저
nrows=1000으로 읽어dtypes·isna()를 확인하고, 확정한dtype·usecols를 전체 로드에 적용합니다.
💡 이럴 때: 한글 CSV가 깨지면 encoding="cp949"(엑셀 저장본) 또는 encoding="utf-8-sig"(BOM 포함)를 시도합니다.
💡 이럴 때: 숫자가 object로 읽히면 thousands=",", 통화기호·공백, na_values 누락을 의심합니다. pd.to_numeric(s, errors="coerce")로 사후 변환도 가능합니다.
pd.read_excel("book.xlsx", sheet_name="2026") # 엔진: openpyxl 필요
pd.read_parquet("data.parquet") # 컬럼형·압축·형 보존, 대용량 권장
pd.read_json("records.json") # orient 옵션 주의
pd.read_sql("SELECT * FROM orders WHERE dt >= %s", con, params=["2026-01-01"])
pd.read_html("https://example.com/table") # 페이지 내 <table> 리스트 반환💡 이럴 때: 중간 산출물을 저장할 때는 CSV 대신 Parquet을 씁니다. dtype(범주·날짜·nullable)이 그대로 보존되어 다시 읽을 때 정제가 필요 없습니다.
pd.json_normalize(records, record_path="items", meta=["order_id", "user"])to_*)df.to_csv("out.csv", index=False) # index=False 습관화 (불필요한 첫 열 방지)
df.to_parquet("out.parquet") # 압축 기본(snappy)
df.to_excel("out.xlsx", sheet_name="결과", index=False)
df.to_json("out.json", orient="records", force_ascii=False) # 한글 그대로to_csv에서 index=False를 빼먹으면 다시 읽을 때 Unnamed: 0 열이 생깁니다.float_format="%.2f".chunksize — 분할 처리total = 0
for chunk in pd.read_csv("huge.csv", chunksize=100_000, usecols=["amount"]):
total += chunk["amount"].sum()각 chunk는 DataFrame입니다. 집계·필터 후 결과만 모으면 전체를 메모리에 올리지 않습니다.
df = pd.read_csv(
"huge.csv",
dtype_backend="pyarrow", # 문자열·결측을 Arrow 배열로 → 메모리 절감
engine="pyarrow", # 파서 자체도 멀티스레드
)category·float32·Int32 지정으로 메모리를 절반 이하로.engine="pyarrow"는 CSV 파싱을 병렬화합니다 (pyarrow 설치 필요).💡 이럴 때: 메모리 부족(
MemoryError)이 나면 ①usecols로 열 축소 → ②dtype으로 형 축소(category,float32) → ③chunksize분할 → ④ Parquet 전환 순으로 시도합니다.
댓글
GitHub 계정으로 의견이나 질문을 남길 수 있습니다.