pandas SettingWithCopyWarning


パンダを使って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]を使用してデータ・フレーム・コピーを作成し、このデータ・フレームを使用して「z」列を検索して割当てを実行します.
  • は、個別のイベントと見なされる.
  • コピーに割り当てを実行するため、dfは元の計画通りに変更されません.
  • df.loc[行選択、列選択]

  • 2df.loc[df['z']<50,'z']を使用すると、dfは予想通りに変更されます.
  • の場合、dfが呼び出されたビューが変更されたと考えられる.
  • DataFrame copyも発生しないため、時間とメモリの面でより有利です.
  • そのため、チェーンインデックスを通常使用するよりも.locを使用することをお勧めします.
  • reference
  • https://realpython.com/pandas-settingwithcopywarning/
  • https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy