달나라 노트

Python Pandas : Series .values vs .to_numpy() 본문

Python/Python Pandas

Python Pandas : Series .values vs .to_numpy()

CosmosProject 2026. 5. 14. 19:25
728x90
반응형

Pandas Series .values vs .to_numpy()

둘 다 Series를 numpy array로 변환하지만, .values는 dtype에 따라 동작이 달라지고 원본을 건드릴 위험이 있습니다. .to_numpy()가 현재 권장 방식입니다.


기본 사용

결과는 같아 보입니다. 차이는 dtype이 복잡해질 때 드러납니다.

import pandas as pd

s = pd.Series([10, 20, 30])

s.values     # array([10, 20, 30])
s.to_numpy() # array([10, 20, 30])

차이 1 — 반환 타입이 dtype에 따라 달라진다

.values는 Series 내부 저장 방식에 따라 반환 타입이 달라집니다.

# 일반 dtype → numpy array 반환
s = pd.Series([1, 2, 3])
type(s.values)       # numpy.ndarray ✓

# nullable integer (대문자 I) → ExtensionArray 반환
s = pd.Series([1, 2, 3], dtype='Int64')
type(s.values)       # pandas.arrays.IntegerArray ✗

# string dtype → StringArray 반환
s = pd.Series(['a', 'b'], dtype='string')
type(s.values)       # pandas.arrays.StringArray ✗
numpy array인 줄 알고 numpy 연산을 쓰면 에러가 납니다.

.to_numpy()는 dtype에 상관없이 항상 numpy array를 반환합니다.

s = pd.Series([1, 2, 3], dtype='Int64')
type(s.to_numpy())   # numpy.ndarray ✓

차이 2 — view 반환으로 인한 원본 수정 위험

일반 dtype에서 .values는 Series 내부 데이터를 직접 가리키는 view를 반환합니다. 복사본이 아닙니다.

s = pd.Series([1, 2, 3])
arr = s.values

arr[0] = 99  # arr을 수정했는데

print(s)
# 0    99   ← 원본 Series도 바뀜!
# 1     2
# 2     3

arrs가 같은 메모리를 바라보고 있기 때문입니다.

.to_numpy()의 기본값은 copy=False로, 가능하면 view를 반환하지만 dtype 변환이 필요한 경우 자동으로 copy합니다. 원본 보호를 확실히 보장하려면 copy=True를 명시합니다.

s = pd.Series([1, 2, 3])
arr = s.to_numpy(copy=True)

arr[0] = 99

print(s)
# 0    1   ← 원본 그대로 보호됨
# 1    2
# 2    3

.values는 deprecated인가?

공식적으로 deprecated는 아닙니다. 하지만 pandas 공식 문서가 .to_numpy() 사용을 권장하고 있어 현업에서는 구식 방법으로 취급됩니다. 위에서 설명한 두 가지 이유 때문입니다.

  • dtype에 따라 반환 타입이 달라짐
  • view 반환으로 원본이 의도치 않게 변경될 수 있음

정리

.values .to_numpy()
반환 타입 dtype에 따라 다름 항상 numpy array
원본 수정 위험 일반 dtype에서 있음 copy=True로 방지 가능
권장 여부 구식 현재 권장 방식

안전한 기본값으로 쓰려면:

arr = s.to_numpy(copy=True)
728x90
반응형
Comments