본문 바로가기
Python/Pandas

pandas dataframe SettingWithCopyWarning 오류 해결하기

by PySun 2023. 10. 6.
반응형

판다스(Pandas) DataFrame을 사용할 때 "SettingWithCopyWarning" 경고 메시지가 발생하는 상황과 이를 해결하기 위한 여러 가지 방법에 대해 설명하겠습니다. 이 경고는 데이터프레임 조작 중 데이터 복사와 참조에 관련된 경고입니다.

경고 메시지 예시:

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.

상황 1: 데이터프레임 슬라이싱 후 값 변경

import pandas as pd

# 데이터프레임 생성
data = {'이름': ['Alice', 'Bob', 'Charlie'],
        '나이': [30, 25, 35]}

df = pd.DataFrame(data)

# 슬라이싱 후 값을 변경하려는 시도
subset = df[df['나이'] > 30]
subset['나이'] = 40

이 경우, "SettingWithCopyWarning" 경고가 발생합니다. 원래 데이터프레임 df를 슬라이싱하여 새로운 데이터프레임 subset을 만들었는데, subset을 통해 값 변경하려는 시도 때문에 경고가 발생합니다.

해결 방법 1: .loc 사용

import pandas as pd

data = {'이름': ['Alice', 'Bob', 'Charlie'],
        '나이': [30, 25, 35]}

df = pd.DataFrame(data)

# .loc를 사용하여 값을 변경
df.loc[df['나이'] > 30, '나이'] = 40

상황 2: 복사본을 만들어 값을 변경하는 경우

import pandas as pd

data = {'이름': ['Alice', 'Bob', 'Charlie'],
        '나이': [30, 25, 35]}

df = pd.DataFrame(data)

# 데이터프레임의 복사본을 만들어 값을 변경
subset = df.copy()
subset['나이'] = 40

이 경우도 "SettingWithCopyWarning" 경고가 발생합니다. 데이터프레임 df의 복사본인 subset을 만들고 값을 변경하려는 시도 때문입니다.

해결 방법 2: .loc 사용

import pandas as pd

data = {'이름': ['Alice', 'Bob', 'Charlie'],
        '나이': [30, 25, 35]}

df = pd.DataFrame(data)

# .loc를 사용하여 값을 변경
subset = df.copy()
subset.loc[:, '나이'] = 40

상황 3: 함수 내에서 값 변경

import pandas as pd

data = {'이름': ['Alice', 'Bob', 'Charlie'],
        '나이': [30, 25, 35]}

df = pd.DataFrame(data)

# 함수 내에서 데이터프레임의 값을 변경하는 경우
def change_age(dataframe):
    dataframe['나이'] = 40

change_age(df)

함수 내에서 데이터프레임의 값을 변경하는 경우에도 "SettingWithCopyWarning" 경고가 발생합니다.

해결 방법 3: 함수에서 .loc 사용

import pandas as pd

data = {'이름': ['Alice', 'Bob', 'Charlie'],
        '나이': [30, 25, 35]}

df = pd.DataFrame(data)

# 함수 내에서 .loc를 사용하여 값을 변경
def change_age(dataframe):
    dataframe.loc[:, '나이'] = 40

change_age(df)

이러한 상황에서 "SettingWithCopyWarning" 경고를 해결하기 위해서는 .loc를 사용하여 데이터프레임의 값을 변경하거나 데이터프레임을 명시적으로 복사하여 작업해야 합니다. 이렇게 하면 경고가 발생하지 않고 원하는 대로 데이터프레임을 조작할 수 있습니다.

반응형