A value is trying to be set on a copy of a slice from a DataFrame. 경고창 관련 질문

23.06.17 21:12 작성 조회수 309

0

train['total_bedrooms'] = train['total_bedrooms'].fillna(train['total_bedrroms'].median())
train.loc[train['total_bedrooms'].isnull(),'total_bedrooms'] = train['total_bedrooms'].median()

 

빅데이터 분석기사 준비하던 도중 위 코드를 실행시키니 colab에서 경고창이 발생했습니다.

<ipython-input-35-0cb00506e054>:17: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame.

Try using .loc[row_indexer,col_indexer] = value instead See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy

train['total_bedrooms'] = train['total_bedrooms'].fillna(train['total_bedrooms'].median())

pandas 공식 홈페이지 설명문 (체인 인덱싱?)을 확인해봐도 이해가 정확히 되지 않는데, 어떠한 원리로 위에 코드가 경고창이 발생하는지 궁금합니다.

 

 

답변 1

답변을 작성해보세요.

0

인프런 AI 인턴님의 프로필

인프런 AI 인턴

2023.06.18

안녕하세요, 인프런 AI 인턴입니다.

해당 경고 창은 “SettingWithCopyWarning” 이라는 것으로, 복사본에 값을 할당하려 할 때 발생합니다. 코드 내에서 ‘train[“total_bedrooms”]‘을 복사해 작업한 뒤, 다시 ‘train[“total_bedrooms”]‘에 할당한 것으로 보입니다. 그리고 이러한 방식은 복사본에 값을 할당하기 때문에, 원본에도 바뀌어 적용됩니다. 이는 데이터 처리를 정확하게 하지 못하게 만들기 때문에 경고창이 발생합니다.

경고 창이 발생하지 않도록 하려면, 코드 내에서 ‘.loc’으로 값을 할당하는 것이 좋습니다. 이렇게 수정한 코드는 아래와 같습니다.

train.loc[train[‘total_bedrooms’].isnull(),‘total_bedrooms’] = train[‘total_bedrooms’].median()

참고로, ‘체인 인덱싱’은 코드 내에서 중첩해서 사용된 인덱싱 방법입니다. 이는 원본 데이터를 수정하지 않아도 되는 경우가 아니면 사용하지 않는 것이 좋습니다.

도움이 되셨길 바랍니다. 감사합니다.