import pandas as pd
exam_data = {'수학' : [90, 80, 70], '영어' : [98, 89, 95],
'음악' : [85, 95, 100], '체육' : [100, 90, 90]}
df = pd.DataFrame(exam_data, index=['서준', '우현', '인아'])
print(df)
print("============")
df2 = df.copy()
df2.drop('우현', inplace=True)
print(df2)
print("============")
df3 = df[:]
df3.drop(['우현', '인아'], axis=0, inplace=True)
print(df3)
df3 = df.copy()
df3.drop(['우현', '인아'], axis=0, inplace=True)
print(df3)
df3 = df[:]
이렇게 복제를 한 후에
df3.drop('우현', inplace=True)
라고 하면 df3 자체의 값을 변경시키는 것이고, 이렇게 되면 파이썬의 정책상 아래와 같은 경고를 발생시킨다
SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame
df3는 df를 복제하긴 했지만 물리적 메모리는 공유하는 상태이다. 즉 테이블과 View의 관계처럼. 이 상태에서 df3의 데이터를 변경시키면 공유하고 있는 df 입장에서 곤란해지는 것이다. 그래서 경고를 주는 것인데, 이를 해결하려면 아래 처럼 접근하면 된다.
df3 = df[:] 대신에 df3 = df.copy() 로 명시적으로 메모리를 달리하거나,
df3.drop('우현'), inplace=True) 대신에 df4 = df3.drop('우현'), inplace=False) 로 명시적으로 메모리를 분리하는 방식이다.
나는 앞으로 복제할 때는 그냥 df[:] 대신에 df.copy()를 사용해야 겠다.
아래글이 이 내용을 잘 설명하고 있다.
https://emilkwak.github.io/pandas-dataframe-settingwithcopywarning