-
Warning 없이 Pandas Dataframe의 데이터 조작하기 - replace학습/Python 2023. 1. 12. 17:23
오늘 태블로 대시보드 용도로 데이터마트 전처리 작업을 하고 있었다. Python으로 몇 가지 레코드를 수정하는 도중에 'SettingWithCopyWarning' 경고가 발생하여 이를 간단한 방법으로 처리했다.
해당 데이터 전처리는 Dataframe에서의 String 값을 변경하고자 하는 값으로 치환하는 작업이었고, filtered dataframe의 정보를 수정하면서 원본dataframe의 값이 변경되었음을 알려주는 경고였다.
Python에서 데이터 분석을 하는경우 원본 Dataframe을 filtering의 결과인 파생 Dataframe을 다루는 경우가 정말 많은데, 크게 신경안쓰고 작업하다보면 해당 경고를 자주 접하게 된다.
평소에는 크게 신경쓰지 않고 대충 넘겨버리거나 .copy로 경고를 처리하곤 하는데
블로그 글도 쓸 겸, 다시 내용 정리도 할 겸
겸사겸사 이번 포스팅 주제로 선정했다.
SettingWithCopyWarning
보통 SettingWithCopyWarning 경고는 다음의 방법으로 쉽게 해결할 수 있다.
- .copy() 함수를 써서 dataframe을 복제하여 복제 테이블을 메모리에 새로 할당
- 복제된 테이블을 사용하여 수정 작업 진행
- Warning 없는 쾌적한 결과창 확인
그러나 나는 요즘 ‘가독성 좋은 코드 작성’과 ‘효율적인 리소스 사용’을 지향하고 있어서...
.copy() 를 사용하지 않고 warning을 처리해보고자 한다.
.copy() 함수는 원본 Dataframe을 복제하여 메모리에 올리기 때문에 리소스가 소모된다.
수정 전 코드
SettingWithCopyWarning발생 상황
# CAUSE_PROCESS_NAME 처리 df.CAUSE_PROCESS_NAME[df.CAUSE_PROCESS_NAME=='변경전1'] = '변경후1' df.CAUSE_PROCESS_NAME[df.CAUSE_PROCESS_NAME=='변경전2'] = '변경전2' df.CAUSE_PROCESS_NAME[df.CAUSE_PROCESS_NAME=='변경전3'] = '변경전3'
수정하기 전의 코드는 정상적으로 치환 작업이 수행되나, 다음과 같은 경고 메세지가 출력된다.
vscode, jupyter notebook에서 SettingWithCopyWarning 경고 발생 1차 수정 - replace()
# CAUSE_PROCESS_NAME 처리 df['CAUSE_PROCESS_NAME'] = df['CAUSE_PROCESS_NAME'].replace('변경전1', '변경후1') df['CAUSE_PROCESS_NAME'] = df['CAUSE_PROCESS_NAME'].replace('변경전2', '변경후2') df['CAUSE_PROCESS_NAME'] = df['CAUSE_PROCESS_NAME'].replace('변경전3', '변경후3')
replace() 사용하여 SettingWithCopyWarning 에러는 해결했으나, 3번이나 반복하여 컬럼을 선언하는 부분이 마음에 들지 않았다.
코드 한 줄로 처리하는 방법은 없을까?
두 번 째 수정
# CAUSE_PROCESS_NAME 처리 df['CAUSE_PROCESS_NAME'] = \\ df['CAUSE_PROCESS_NAME'].replace(['변경전1', '변경전2', '변경전3'] , ['변경후1', '변경후2', '변경후3'])
3 회 반복했던 부분을 리스트 조건을 사용하여 1 번으로 줄였다.
(가독성을 위해 줄바꿈 했지만... 붙이면 코드 한 줄이다!)
아예 선언하지 않고 원본 dataframe을 바로 수정할 수 없을까?
최종 수정
# CAUSE_PROCESS_NAME 처리 df['CAUSE_PROCESS_NAME'].replace(['변경전1', '변경전2', '변경전3'] , ['변경후1', '변경후2', '변경후3'], inplace = True)
inplace 조건을 추가하여 불필요한 선언 과정 없이 작업을 완료했다.
dataframe 컬럼을 바로 삭제하고 싶을 때
drop에 inplace=True 조건을 추가하는 것과 동일한 방법이다.
끝!
참고
SettingWithCopyWarning 정리- https://emilkwak.github.io/pandas-dataframe-settingwithcopywarning
Pandas의 DataFrame 사용 중 SettingWithCopyWarning 발생할 때
Python, Pandas를 Excel보다 사랑하는 직장인을 위한 블로그
emilkwak.github.io
'학습 > Python' 카테고리의 다른 글
판다스가 너무 느리다면? Polars! (0) 2024.05.07 FFT를 활용한 시계열 데이터 노이즈 처리 in Python (1) 2023.10.27