인프런 커뮤니티 질문&답변

빅분기수강생님의 프로필 이미지

작성한 질문수

[퇴근후딴짓] 빅데이터 분석기사 실기 (작업형1,2,3)

SettingWithCopyWarning 관련 질문

해결된 질문

24.06.13 17:47 작성

·

89

0

기출2회 작업형 1

문제 2번 풀이 중 SettingWithCopyWarning가 같이 출력됩니다

문제 2번

  • 주어진 데이터셋(members.csv)의 앞에서부터 순서대로 80% 데이터만 활용해 'f1'컬럼 결측치를 중앙값으로 채우기 전 후의 표준편차를 구하고, 두 표준편차 차이 계산하기 (단, 표본표준편차 기준, 두 표준편차 차이는 절대값으로 계산)

import pandas as pd
df = pd.read_csv("members.csv")

# print(df.shape)
# int(len(df)*0.8)

df2= df.iloc[:int(len(df)*0.8),:]
# print(df2.shape)

std1 = df2["f1"].std()   ## 20.574853076621935
print(std1)
# print(df2)
# print(df2["f1"].median())    # 68.0
df2["f1"] =  df2["f1"].fillna(df2["f1"].median())

std2 = df2["f1"].std()   ## 17.010788646613268
print(std2)
print(std1-std2)           

저는 이렇게 풀었고요. 아래처럼 출력되더라고요

20.574853076621935
17.010788646613268
3.564064430008667
<ipython-input-43-d0c995e0379e>:14: 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
  df2["f1"] =  df2["f1"].fillna(df2["f1"].median())

정답은 풀이 내용 출력값과 일치하는데, SettingWithCopyWarning 가 나서 자꾸 신경이쓰이네요.

실제시험에서 혹시 문제가 생길 수 있을까요...?

 

 

 

 

답변 2

0

퇴근후딴짓님의 프로필 이미지
퇴근후딴짓
지식공유자

2024. 06. 13. 21:59

df2= df.iloc[:int(len(df)*0.8),:]

이렇게 데이터프레임을 다른 변수로 옮겨 담게 되면 뒤에 .copy()를 붙여주세요

df2 = df.iloc[:int(len(df) * 0.8), :].copy()

0

인프런 AI 인턴님의 프로필 이미지

2024. 06. 13. 17:51

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

빅분기수강생님의 질문에 대해 답변드립니다. 질문 내용을 바탕으로 “SettingWithCopyWarning” 문제와 관련하여 유사한 상황에 대한 해결 방법을 찾아보았습니다.

이 경고 메시지는 pandas에서 DataFrame의 일부를 선택하여 작업을 할 때 발생할 수 있습니다. 경고의 핵심은 “복사본(copy)“이 아닌 “뷰(view)“에 대한 값 설정을 시도하고 있다는 것입니다. 이 경우, 원본 데이터가 의도치 않게 변경될 가능성을 경고하며 이를 피하기 위한 방법으로 .loc[row_indexer, col_indexer] = value를 사용하라는 권장사항을 제시하고 있습니다.

같은 경고와 관련된 해결 방안으로, 데이터를 수정하기 전에 .copy()를 사용하여 데이터의 복사본을 생성하는 것이 멘션되었습니다. 이렇게 하면 원본 DataFrame을 직접 수정하는 대신 복사본에 대해 작업하게 되어 해당 경고를 방지할 수 있습니다.

관련된 정보를 찾아보니, “warning 관련” 질문에 대한 답변에서 유사한 문제 해결 방법이 제시되었습니다. 이 문제의 경우, 특정 컬럼에 대한 결측치를 중앙값으로 채우는 과정에서 경고가 발생하였고, 해결 방안으로 데이터프레임을 분리할 때 .copy()를 사용하는 것이 소개되었습니다.

df2= df.iloc[:int(len(df)*0.8),:].copy() # 여기에 .copy()를 추가

이와 유사한 상황에서는 결측치를 채우기 전에, 선택한 데이터프레임(df2) 부분이 원본 데이터의 뷰가 아니라 독립적인 복사본이 될 수 있도록 .copy() 메소드를 추가함으로써 경고를 방지할 수 있습니다.

실제 시험에서 이런 경고가 나타나는 것은 본질적으로 코드 실행에 반드시 문제가 되는 것은 아니지만, 원치 않는 데이터 수정을 피하기 위한 주의사항을 알려주는 것입니다. 따라서, 경고 메시지에 나타난 해결 방법을 참고하여 코드를 수정하면 됩니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.