pandas SettingWithCopyWarning
pandas를 사용하다가 SettingWithCopyWarning
이 발생하였다.
/usr/local/lib/python3.7/dist-packages/ipykernel_launcher.py:1: 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
See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
"""Entry point for launching an IPython kernel.
Example
data = {"x": 2**np.arange(5),
"y": 3**np.arange(5),
"z": np.array([45, 98, 24, 11, 64])}
index = ["a", "b", "c", "d", "e"]
df = pd.DataFrame(data=data, index=index)
df
x y z
a 1 1 45
b 2 3 98
c 4 9 24
d 8 27 11
e 16 81 64
- z가 50 미만인 것 중에서 z를 0으로 만들려고 한다.
chained indexing(df[][]).
df[df['z']<50]['z'] = 0
- 이 경우,
df[df['z']<50]
로 DataFrame 복사본을 하나 더 만들고, 그 DataFrame을 가지고 'z' column을 찾아 assignment를 수행한다. - 각각의 수행은 별도의 event로 간주된다.
- 복사본에 assignment를 수행하려고 하므로 원래 의도한대로 df에는 변경이 일어나지 않는다.
df.loc[행 선택,열 선택]
df.loc[df['z']<50,'z']
을 사용하면 의도한대로 df의 변경이 이루어진다.- 이 경우, df의 view를 호출하여 변경하였다고 볼 수 있다.
- DataFrame copy도 일어나지 않기 때문에, 시간, 메모리적으로 훨씬 이득이다.
- 그래서 평소에 chain indexing 보다는
.loc
을 쓰는 것이 더 권장된다.
- reference
Author And Source
이 문제에 관하여(pandas SettingWithCopyWarning), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@mycogno/pandas-SettingWithCopyWarning저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)