[2026 최신] Pandas 3.0이 출시되었습니다: Copy-on-Write, PyArrow, 그리고 알아야 할 내용
Source: Dev.to

Introduction & TL;DR
오랫동안 기다려온 Pandas 3.0이 공식적으로 출시되었습니다(2026년 초 릴리스). 수년간 라이브러리에 가장 근본적인 변화를 가져옵니다. 파이썬에서 데이터를 다루는 경우, 이번 업그레이드로 코드 실행 방식, 성능, 그리고 가끔 발생하던 오류가 크게 달라집니다.
TL;DR: 가장 큰 변화
- Copy‑on‑Write (CoW)가 이제 기본값이 되었습니다. 이제
SettingWithCopyWarning에 시달릴 필요가 없습니다. - PyArrow 문자열 백엔드. 문자열용 기존
objectdtype이 사라지고, 번개처럼 빠른 Apache Arrow 백엔드로 대체되었습니다. - 체인된 할당 오류. 체인 인덱싱을 통해 DataFrame을 수정할 때(
df[df['A'] > 0]['B'] = 1등) 경고가 아닌 오류가 발생합니다.
1. 복사‑온‑쓰기가 이제 표준이 되었습니다
역사적으로 Pandas 사용자들은 연산이 원본 데이터의 뷰(view) 를 반환하는지 복사(copy) 를 반환하는지 예측하기 어려웠습니다. 이러한 예측 불가능성은 악명 높은 SettingWithCopyWarning 을 낳았습니다.
Pandas 3.0에서는 복사‑온‑쓰기(Copy‑on‑Write, CoW)가 기본적으로 활성화되며 끌 수 없습니다.
이것은 무엇을 의미할까요?
다른 객체에서 파생된 DataFrame 또는 Series는 완전히 별개의 객체처럼 동작합니다. 하지만 성능을 유지하기 위해 실제 데이터 복사는 지연(lazy) 평가 방식으로, 객체 중 하나를 명시적으로 수정할 때까지 이루어지지 않습니다.
import pandas as pd
df = pd.DataFrame({"A": [1, 2, 3]})
subset = df[df["A"] > 1] # 아직 데이터가 복사되지 않았습니다!
# 'subset'을 수정하면 내부적으로 복사가 트리거됩니다.
# 원본 'df'는 전혀 변하지 않습니다.
subset.iloc[0, 0] = 99
전문 용어 설명: 복사‑온‑쓰기 (Copy‑on‑Write, CoW)
CoW는 메모리 관리 기법입니다. 새로운 변수를 만들 때 데이터를 즉시 복제하는 대신, 두 변수 모두 같은 메모리를 가리키게 합니다. 어느 한쪽이 수정되는 정확한 순간에만 별도의 복사가 이루어집니다.
변경 사항: 체이닝 할당
CoW 때문에 체이닝 할당은 공식적으로 깨졌습니다.
- # Pandas 2.x (Warning) 또는 Pandas 3.0 (ChainedAssignmentError)
- df[df['col1'] > 10]['col2'] = 100
+ # Pandas 3.0 올바른 사용법
+ df.loc[df['col1'] > 10, 'col2'] = 100
항상 .loc를 사용하여 부분집합에 값을 설정하세요!
실습: 지연 복사 확인하기
메모리 공유를 추적하여 CoW가 실제로 어떻게 동작하는지 확인할 수 있습니다:
import pandas as pd
import numpy as np
# pandas >= 3.0 필요
df = pd.DataFrame({"A": [1, 2, 3], "B": [4, 5, 6]})
# 슬라이싱은 뷰를 생성하며, CoW를 완벽히 보여줍니다
subset = df.iloc[1:3]
# 1. 이 시점에서 두 DataFrame은 메모리를 공유합니다
print(np.shares_memory(df["B"].values, subset["B"].values)) # True
# 2. 부분집합을 변경하면 지연 복사가 발생합니다
subset.iloc[0, 1] = 99
# 3. 이제 완전히 별개의 메모리를 갖게 됩니다
print(np.shares_memory(df["B"].values, subset["B"].values)) # False
2. PyArrow 문자열 백엔드
대용량 텍스트 데이터셋을 다뤄본 적이 있다면, Pandas가 과거에 문자열을 일반 Python object 타입으로 저장했으며 이는 속도와 메모리 측면에서 비효율적이었다는 것을 알 수 있습니다.
버전 3.0부터 문자열은 전용 str dtype으로 추론되며, Apache Arrow에 의해 지원됩니다 ( pyarrow 가 설치된 경우).
성능 향상
PyArrow 백엔드로 전환하면 엄청난 성능 향상을 얻을 수 있습니다:
- 속도: 문자열 연산 (
.str.contains(),.str.lower())이 5–10 배 빠르게 실행됩니다. - 메모리: 텍스트가 많은 컬럼의 메모리 사용량이 최대 50 % 감소합니다.
import pandas as pd
# If pyarrow is installed, 'text' is now a PyArrow string array by default.
df = pd.DataFrame({"text": ["apple", "banana", "cherry"]})
print(df.dtypes)
# text string[pyarrow]
# dtype: object
이 컬럼형 Arrow 포맷은 Polars와 DuckDB 같은 최신 도구와 제로‑카피 데이터 공유를 가능하게 합니다.
3. 기타 주목할 만한 변경 사항
- 마이크로초 해상도:
datetime데이터의 기본 해상도가 이제 마이크로초(나노초 대신)이며, 1678–2262 범위 밖 날짜에 대한 범위 초과 오류를 해결합니다. - 제거된 폐기 예정 기능:
DataFrame.applymap()(대신.map()사용),Series.ravel(),DataFrame.append()(대신pd.concat()사용)와 같은 함수가 영구적으로 제거되었습니다. - Python 3.11+ 요구 사항: Pandas 3.0은 최소 Python 3.11 및 NumPy 1.26.0이 필요합니다.
결론
Pandas 3.0은 큰 도약이며, 지난 10년 동안 가장 큰 두 가지 문제점인 문자열의 메모리 비효율성과 예측할 수 없는 view‑vs‑copy 동작을 성공적으로 해결했습니다.
레거시 코드를 마이그레이션하는 데(특히 체인 할당을 제거하는 작업) 주말 정도가 걸릴 수 있지만, 그 결과 얻는 성능과 안정성은 그 노력만큼 충분히 가치가 있습니다.
Pandas 3.0 마이그레이션 과정에서 특별히 겪은 어려움이 있나요? 댓글로 알려 주세요!