pandas SettingWithCopyWarning

mycogno·2022년 3월 19일
0

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을 쓰는 것이 더 권장된다.

profile
What's on your mind?

0개의 댓글