데린이 재영

SettingWithCopyWarning 경고 메시지 대처하기 - 깊은복사? 얕은복사? 본문

Error

SettingWithCopyWarning 경고 메시지 대처하기 - 깊은복사? 얕은복사?

재용용 2022. 10. 27. 16:35

목표설정

- 깊은 복사와 얕은 복사 정의하기

- 경고 메시지 분석하기

- 경고 메시지 해결하기


깊은 복사, 얕은 복사

- 왜 알아야할까?

변수에 값을 할당할 때, 즉 복사가 이루어지는 과정에서 깊이에 따라 재 사용시 !경고! 메시지가 뜰 수 있기 때문에, 알아두면 좋을 것 같다.

(1) 얕은 복사

- 얕은 복사란, '주소 값'을 복사한다는 의미입니다.

- 슬라이싱을 통해 새로운 값을 할당하면 아래와 같이 두 변수는 서로 영향을 받지 않는다. (슬라이싱 기능은 얕은 복사에 해당)

- copy 모듈의 copy 메소드 또한 얕은 복사에 해당한다.

a = [1, 2, 3, 4, 5]
b = a[:3]
>>> print(f"a: {a}, b: {b}")
a: [1, 2, 3, 4, 5], b: [1, 2, 3]

 

(2) 깊은 복사

- 깊은 복사란, '실제 값'을 새로운 메모리 공간에 복사하는 것을 의미합니다.

- 새로운 복합 객체를 만들고, 재귀적으로 원본 객체의 사본을 새로 만든 복합 객체에 삽입한다. 

- 즉, 새롭게 copy 되는 것이다.

 


pandas - 경고 메시지 분석

1. Dataframe 을 슬라이싱하여 y_test 와 y_predict 라는 변수에 할당해 주었다.

2. y_test와 y_predict를 메소드 등을 사용해서 추가적으로 변경해 주었다.

3. 아래와 같은 메시지 발생

왜 경고가 발생되었을까?

- SettingWithCopyWarning : Pandas 자체에서 발생시키는 경고 (Warning) 메시지

- 경고 원천 : 파생 데이터프레임에 변경을 가하는 경우 

 

왜 경고가 발생하는걸까?

- Pandas DataFrame은 연쇄적인 연산과 처리를 허용하며 자료구조이기 때문에 메모리를 점유한다.

- 모든 데이터프레임에 메모리를 할당하려 들면 금방 바닥을 보이게 될 것이다.

- 원천 데이터프레임을 생성할 때만 메모리를 할당하고 파생되는 데이터프레임은 원천 데이터프레임을 이미 적재된 메모리에 접근케 하면 메모리를 절약할 수 있다.

  - copy() 메서드를 통해 파생 데이터프레임에 독립적인 메모리를 부여할 수 있다!

 

pandas - 경고 메시지 해결

- 파생 데이터프레임에 copy() 메서드를 실행해, 원천 DataFrame 과 별도인 메모리 공간을 파생 DataFrame에 부여

# 위 경고 메시지를 해결하려면 아래와 같이 입력하면 됨
y_test = df[:100].copy()
y_predict = df[100:].copy()

 

한줄 정리

pandas 데이터프레임을 사용할 때! 다른 파생 변수를 만들어야 한다면, 메모리 절약을 위해 .copy() 메서드를 이용하자!


참고문헌

1. [위키독스] 파이썬 - 기본을 갈고 닦자! : 12. 얕은 복사(shallow copy)와 깊은 복사(deep copy)

https://wikidocs.net/16038

2. [pandas 공식문서] - Returning a view versus a copy

https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy

3. [python 공식문서] - copy : 얕은 복사와 깊은 복사 연산

https://docs.python.org/ko/3.8/library/copy.html

추천 👉 4. Emil Kwak - Pandas의 DataFrame 사용 중 SettingWithCopyWarning 발생할 때

https://emilkwak.github.io/pandas-dataframe-settingwithcopywarning

 

 

Comments