본문 바로가기

Pandas

DataFrame - drop, copy


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

 

Pandas의 DataFrame 사용 중 SettingWithCopyWarning 발생할 때

Python, Pandas를 Excel보다 사랑하는 직장인을 위한 블로그

emilkwak.github.io


Where there is a will there is a way