From b4b461e0c69e420b0b583bef15f4d740b276693e Mon Sep 17 00:00:00 2001 From: David Leon Date: Tue, 20 Dec 2022 19:02:33 +0100 Subject: [PATCH] added copy on write for droplevel --- pandas/core/generic.py | 3 ++- pandas/tests/copy_view/test_methods.py | 17 +++++++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/pandas/core/generic.py b/pandas/core/generic.py index 2de83bb7a4468..084ebc04694db 100644 --- a/pandas/core/generic.py +++ b/pandas/core/generic.py @@ -740,7 +740,8 @@ def _set_axis_nocheck(self, labels, axis: Axis, inplace: bool_t, copy: bool_t): else: # With copy=False, we create a new object but don't copy the # underlying data. - obj = self.copy(deep=copy) + if copy: + obj = self.copy(deep=None) setattr(obj, obj._get_axis_name(axis), labels) return obj diff --git a/pandas/tests/copy_view/test_methods.py b/pandas/tests/copy_view/test_methods.py index bf65f153b10dd..42fdc2d8353c2 100644 --- a/pandas/tests/copy_view/test_methods.py +++ b/pandas/tests/copy_view/test_methods.py @@ -280,3 +280,20 @@ def test_head_tail(method, using_copy_on_write): # without CoW enabled, head and tail return views. Mutating df2 also mutates df. df2.iloc[0, 0] = 1 tm.assert_frame_equal(df, df_orig) + +def test_droplevel(using_copy_on_write): + # GH 49473 + df = DataFrame({"a": [1, 2, 3], "b": [4, 5, 6], "c": [7, 8, 9]}).set_index(["a","b"]) + df_orig = df.copy() + df2 = df.droplevel(0) + + if using_copy_on_write: + assert np.shares_memory(get_array(df2, "c"), get_array(df, "c")) + else: + assert not np.shares_memory(get_array(df2, "c"), get_array(df, "c")) + + # mutating df2 triggers a copy-on-write for that column / block + df2.loc["b","c"] = 1 + + assert not np.shares_memory(get_array(df2, "c"), get_array(df, "c")) + tm.assert_frame_equal(df, df_orig)