From f4d8df124b0657f65391d49955fc19f40f4658af Mon Sep 17 00:00:00 2001 From: Patrick Hoefler Date: Wed, 1 Mar 2023 00:46:52 +0100 Subject: [PATCH 1/3] REF: Remove sanitize_column from _iset_item --- pandas/core/frame.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/pandas/core/frame.py b/pandas/core/frame.py index dbbe2c0751f3a..fd7a01ac616cd 100644 --- a/pandas/core/frame.py +++ b/pandas/core/frame.py @@ -4105,9 +4105,8 @@ def _set_item_mgr(self, key, value: ArrayLike) -> None: if len(self): self._check_setitem_copy() - def _iset_item(self, loc: int, value) -> None: - arraylike = self._sanitize_column(value) - self._iset_item_mgr(loc, arraylike, inplace=True) + def _iset_item(self, loc: int, value: Series) -> None: + self._iset_item_mgr(loc, value._values, inplace=True) # check if we are modifying a copy # try to set first as we want an invalid From 8b28a56fac488afbba12782c693e8f5300547490 Mon Sep 17 00:00:00 2001 From: Patrick Hoefler Date: Wed, 1 Mar 2023 15:06:59 +0100 Subject: [PATCH 2/3] Add comment --- pandas/core/frame.py | 5 ++++- pandas/tests/copy_view/test_replace.py | 11 +++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/pandas/core/frame.py b/pandas/core/frame.py index fd7a01ac616cd..b8632a52f8988 100644 --- a/pandas/core/frame.py +++ b/pandas/core/frame.py @@ -4106,7 +4106,10 @@ def _set_item_mgr(self, key, value: ArrayLike) -> None: self._check_setitem_copy() def _iset_item(self, loc: int, value: Series) -> None: - self._iset_item_mgr(loc, value._values, inplace=True) + # We are only called from _replace_columnwise which guarantees that + # no reindex is necessary + # TODO(CoW): Optimize to avoid copy here, but have ton track refs + self._iset_item_mgr(loc, value._values.copy(), inplace=True) # check if we are modifying a copy # try to set first as we want an invalid diff --git a/pandas/tests/copy_view/test_replace.py b/pandas/tests/copy_view/test_replace.py index c0b5498b839f5..81457237c2848 100644 --- a/pandas/tests/copy_view/test_replace.py +++ b/pandas/tests/copy_view/test_replace.py @@ -362,3 +362,14 @@ def test_replace_list_none_inplace_refs(using_copy_on_write): tm.assert_frame_equal(df_orig, view) else: assert np.shares_memory(arr, get_array(df, "a")) + + +def test_replace_columnwise_no_op(using_copy_on_write): + df = DataFrame({"a": [1, 2, 3], "b": [1, 2, 3]}) + df_orig = df.copy() + df2 = df.replace({"a": 10}, 100) + df2.iloc[0, 0] = 100 + if using_copy_on_write: + # TODO(CoW): This should share memory + assert not np.shares_memory(get_array(df2, "a"), get_array(df, "a")) + tm.assert_frame_equal(df, df_orig) From 83f3bedda2ca36d0cd32493bf7d918448aa47387 Mon Sep 17 00:00:00 2001 From: Patrick Hoefler <61934744+phofl@users.noreply.github.com> Date: Wed, 1 Mar 2023 17:39:26 +0100 Subject: [PATCH 3/3] Update test_replace.py --- pandas/tests/copy_view/test_replace.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pandas/tests/copy_view/test_replace.py b/pandas/tests/copy_view/test_replace.py index 81457237c2848..dfb1caa4b2ffd 100644 --- a/pandas/tests/copy_view/test_replace.py +++ b/pandas/tests/copy_view/test_replace.py @@ -368,8 +368,8 @@ def test_replace_columnwise_no_op(using_copy_on_write): df = DataFrame({"a": [1, 2, 3], "b": [1, 2, 3]}) df_orig = df.copy() df2 = df.replace({"a": 10}, 100) - df2.iloc[0, 0] = 100 if using_copy_on_write: # TODO(CoW): This should share memory assert not np.shares_memory(get_array(df2, "a"), get_array(df, "a")) + df2.iloc[0, 0] = 100 tm.assert_frame_equal(df, df_orig)