From 6f7954287d7992022d69e9945556df919324faa9 Mon Sep 17 00:00:00 2001 From: Joris Van den Bossche Date: Fri, 10 Feb 2023 14:36:03 +0100 Subject: [PATCH 1/4] TST: add COW test for setitem with Series being set --- pandas/tests/copy_view/test_methods.py | 27 ++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/pandas/tests/copy_view/test_methods.py b/pandas/tests/copy_view/test_methods.py index 6b54345723118..609114bc4c776 100644 --- a/pandas/tests/copy_view/test_methods.py +++ b/pandas/tests/copy_view/test_methods.py @@ -1308,3 +1308,30 @@ def test_isetitem(using_copy_on_write): assert np.shares_memory(get_array(df, "c"), get_array(df2, "c")) else: assert not np.shares_memory(get_array(df, "c"), get_array(df2, "c")) + + +@pytest.mark.parametrize( + "dtype", ["int64", "float64"], ids=["single-block", "mixed-block"] +) +def test_isetitem_series(using_copy_on_write, dtype): + df = DataFrame({"a": [1, 2, 3], "b": np.array([4, 5, 6], dtype=dtype)}) + ser = Series([7, 8, 9]) + ser_orig = ser.copy() + df.isetitem(0, ser) # This is inplace + + if using_copy_on_write: + # TODO(CoW) this can share memory + assert not np.shares_memory(get_array(df, "a"), get_array(ser)) + + # mutating dataframe doesn't update series + df.loc[0, "a"] = 0 + tm.assert_series_equal(ser, ser_orig) + + # mutating series doesn't update dataframe + df = DataFrame({"a": [1, 2, 3], "b": [4, 5, 6]}) + ser = Series([7, 8, 9]) + df.isetitem(1, ser) # This is inplace + + ser.loc[0] = 0 + expected = df = DataFrame({"a": [7, 8, 9], "b": np.array([4, 5, 6], dtype=dtype)}) + tm.assert_frame_equal(df, expected) From ee0cf52786ce812634b07747fbfce393c3ece5cb Mon Sep 17 00:00:00 2001 From: Patrick Hoefler <61934744+phofl@users.noreply.github.com> Date: Fri, 10 Feb 2023 19:44:37 +0100 Subject: [PATCH 2/4] Update test_methods.py --- pandas/tests/copy_view/test_methods.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pandas/tests/copy_view/test_methods.py b/pandas/tests/copy_view/test_methods.py index df955c5b3bf19..031348598c81a 100644 --- a/pandas/tests/copy_view/test_methods.py +++ b/pandas/tests/copy_view/test_methods.py @@ -1336,7 +1336,7 @@ def test_isetitem_series(using_copy_on_write, dtype): df.isetitem(1, ser) # This is inplace ser.loc[0] = 0 - expected = df = DataFrame({"a": [7, 8, 9], "b": np.array([4, 5, 6], dtype=dtype)}) + expected = DataFrame({"a": [7, 8, 9], "b": np.array([4, 5, 6], dtype=dtype)}) tm.assert_frame_equal(df, expected) From ccfc805186d93b34a2391d2e76dd8ec80d353aef Mon Sep 17 00:00:00 2001 From: Joris Van den Bossche Date: Fri, 10 Feb 2023 20:01:28 +0100 Subject: [PATCH 3/4] Update test_methods.py --- pandas/tests/copy_view/test_methods.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pandas/tests/copy_view/test_methods.py b/pandas/tests/copy_view/test_methods.py index 031348598c81a..8f1066582404b 100644 --- a/pandas/tests/copy_view/test_methods.py +++ b/pandas/tests/copy_view/test_methods.py @@ -1320,7 +1320,7 @@ def test_isetitem_series(using_copy_on_write, dtype): df = DataFrame({"a": [1, 2, 3], "b": np.array([4, 5, 6], dtype=dtype)}) ser = Series([7, 8, 9]) ser_orig = ser.copy() - df.isetitem(0, ser) # This is inplace + df.isetitem(0, ser) if using_copy_on_write: # TODO(CoW) this can share memory @@ -1333,7 +1333,7 @@ def test_isetitem_series(using_copy_on_write, dtype): # mutating series doesn't update dataframe df = DataFrame({"a": [1, 2, 3], "b": [4, 5, 6]}) ser = Series([7, 8, 9]) - df.isetitem(1, ser) # This is inplace + df.isetitem(1, ser) ser.loc[0] = 0 expected = DataFrame({"a": [7, 8, 9], "b": np.array([4, 5, 6], dtype=dtype)}) From 3ce4c67b90acd23aae4b5c0abaaa25f146b9e6ac Mon Sep 17 00:00:00 2001 From: Joris Van den Bossche Date: Sat, 11 Feb 2023 09:35:23 +0100 Subject: [PATCH 4/4] fixup --- pandas/tests/copy_view/test_methods.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pandas/tests/copy_view/test_methods.py b/pandas/tests/copy_view/test_methods.py index 8f1066582404b..f180823e09909 100644 --- a/pandas/tests/copy_view/test_methods.py +++ b/pandas/tests/copy_view/test_methods.py @@ -1331,9 +1331,9 @@ def test_isetitem_series(using_copy_on_write, dtype): tm.assert_series_equal(ser, ser_orig) # mutating series doesn't update dataframe - df = DataFrame({"a": [1, 2, 3], "b": [4, 5, 6]}) + df = DataFrame({"a": [1, 2, 3], "b": np.array([4, 5, 6], dtype=dtype)}) ser = Series([7, 8, 9]) - df.isetitem(1, ser) + df.isetitem(0, ser) ser.loc[0] = 0 expected = DataFrame({"a": [7, 8, 9], "b": np.array([4, 5, 6], dtype=dtype)})