본문 바로가기
Python/Pandas

pandas dataframe SettingWithCopyWarning 오류 해결하기

by PySun 2023. 10. 26.
반응형

"SettingWithCopyWarning"은 Pandas 데이터프레임을 슬라이싱하고 그 슬라이스에 값을 할당하려고 할 때 발생할 수 있는 경고입니다. 이 경고는 데이터프레임이 슬라이싱된 경우 원본 데이터프레임이 변경될 수 있는 잠재적인 문제를 나타내며, 코드를 보다 안전하게 작성하도록 도와줍니다. 이 경고를 해결하기 위해서는 Pandas에서 슬라이싱과 할당을 어떻게 수행해야 하는지 이해하는 것이 중요합니다. 다음은 "SettingWithCopyWarning"가 발생할 수 있는 상황과 해결 방법을 설명하겠습니다.

상황 1: 데이터프레임 슬라이싱 후 값을 할당하는 경우

import pandas as pd

# SettingWithCopyWarning을 발생시키는 상황
df = pd.DataFrame({'A': [1, 2, 3]})
subset = df[df['A'] > 1]
subset['B'] = 0

이 경우, "subset"은 원본 데이터프레임 "df"의 슬라이스입니다. "subset"에 값을 할당하려고 하면 "SettingWithCopyWarning"이 발생합니다.

해결 방법 1: 원본 데이터프레임 변경

슬라이싱된 데이터프레임이 원본 데이터프레임의 뷰(view)가 아니라 복사본(copy)이 되도록 하려면 "copy()" 메서드를 사용하세요.

import pandas as pd

# 원본 데이터프레임을 변경하기 위해 슬라이스를 복사
df = pd.DataFrame({'A': [1, 2, 3]})
subset = df[df['A'] > 1].copy()
subset['B'] = 0

 

상황 2: loc 또는 iloc를 사용하여 데이터프레임에 접근하는 경우

import pandas as pd

# SettingWithCopyWarning을 발생시키는 상황
df = pd.DataFrame({'A': [1, 2, 3]})
subset = df.loc[df['A'] > 1]
subset['B'] = 0

이 경우, "subset"은 "df.loc[df['A'] > 1]"의 결과로 생성된 데이터프레임입니다. 이때 "subset"에 값을 할당하려고 하면 "SettingWithCopyWarning"이 발생합니다.

해결 방법 2: loc 또는 iloc를 사용하여 데이터프레임에 접근

.loc 또는 .iloc를 사용하여 데이터프레임에 접근하면 "SettingWithCopyWarning"을 피할 수 있습니다. 이러한 메서드를 사용하면 원본 데이터프레임이 변경됩니다.

import pandas as pd

# .loc 또는 .iloc를 사용하여 데이터프레임에 접근
df = pd.DataFrame({'A': [1, 2, 3]})
subset = df.loc[df['A'] > 1]
subset['B'] = 0

 

상황 3: DataFrame.copy()를 사용하지 않고 슬라이스를 복사하는 경우

import pandas as pd

# SettingWithCopyWarning을 발생시키는 상황
df = pd.DataFrame({'A': [1, 2, 3]})
subset = df[df['A'] > 1]
subset = subset.copy()  # 이 부분을 빼먹는 경우 경고 발생
subset['B'] = 0

이 경우, "subset"에 값을 할당하려고 하더라도 "SettingWithCopyWarning"이 발생합니다. 이유는 "subset"은 원본 데이터프레임 "df"의 슬라이스를 복사한 것이 아니라 슬라이스의 뷰를 가리키기 때문입니다.

해결 방법 3: 슬라이스를 복사

슬라이스를 복사하려면 .copy() 메서드를 사용하세요.

import pandas as pd

# 슬라이스를 복사
df = pd.DataFrame({'A': [1, 2, 3]})
subset = df[df['A'] > 1].copy()
subset['B'] = 0

 

"SettingWithCopyWarning"을 해결하려면 슬라이싱된 데이터프레임이 원본 데이터프레임의 뷰가 아니라 복사본이 되도록 하고, 필요하면 .copy() 메서드를 사용하여 슬라이스를 명시적으로 복사하세요.

반응형