# yesterday_result는 pandas.DataFrame()
# datetime 타입의 ['pubDate'] 를 문자열 타입으로 변경하여 ['date'] 에 추가 저장
yesterday_result['date'] = yesterday_result['pubDate'].dt.strftime('%Y-%m-%d %H:%M:%S')
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
pandas에서 슬라이스된 데이터프레임에 값을 설정하려고 할 때 발생하는 SettingWithCopyWarning
이다.
이 경고는 슬라이스가 원본 데이터프레임의 뷰(view)가 아닌 복사본(copy)일 수 있으며, 이 경우 값 설정이 원본 데이터프레임에 반영되지 않을 수 있음을 알려준다.
슬라이스의 복사본 : 슬라이스된 데이터프레임이 원본 데이터프레임의 복사본일 수 있다. 이 경우, 슬라이스에 값을 설정해도 원본 데이터프레임에는 반영되지 않는다.
잠재적인 버그 : 슬라이스가 복사본인지 뷰인지 명확하지 않기 때문에 코드가 의도한대로 동작하지 않을 수 있다.
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
.loc
인덱서를 사용하여 값을 설정
슬라이스된 데이터프레임 대신 .loc
인덱서를 사용하여 직접 원본 데이터프레임에 값을 설정한다.
df.loc[row_indexer, col_indexer] = value
슬라이스를 명확하게 복사본으로 만든다.
슬라이스를 명확하게 복삿본으로 만들어 경고를 피할 수 있다.
df_slice = df[df['A'] > 1].copy
df_slict['B'] = 0
# 에러 발생 코드
yesterday_result['date'] = yesterday_result['pubDate'].dt.strftime('%Y-%m-%d %H:%M:%S')
# .loc 인덱서를 사용하여 경고 해결
yesterday_result.loc[:, 'date'] = yesterday_result['pubDate'].dt.strftime('%Y-%m-%d %H:%M:%S')
3.0
버전부터는 CoW 가 기본모드가 되면서 위 경고가 더 이상 발생하지 않을 것이다.pandas 3.0 이전 버전에서는 Copy-on-Write(CoW)가 기본 모드가 아니다. 따라서, 데이터프레임이나 시리즈가 다른 객체에서 파생될 때 항상 복사본으로 동작하지 않는다. 이전 버전에서는 일부 연산이 뷰(view)를 반환하고, 일부는 복사본(copy)을 반환하기 때문에, 예측하기 어려운 동작이 발생할 수 있다.
예를 들어, 슬라이스된 데이터프레임에 값을 설정할 때 원본 데이터프레임에 영향을 미칠 수 있으며, 이로 인해 SettingWithCopyWarning 경고가 발생한다. 이는 체인 인덱싱(chained indexing)으로 인해 발생하는 문제를 방지하기 위한 경고이다.
하지만, pandas 1.5.0 버전부터 CoW 모드가 도입되었으며, pandas 2.0 버전부터 대부분의 최적화가 지원된다. pandas 3.0에서는 CoW가 기본 모드가 되어 모든 데이터프레임이나 시리즈가 복사본으로 동작하게 된다. 따라서, pandas 3.0에서는 SettingWithCopyWarning 경고가 더 이상 발생하지 않는다.