diff --git a/pandas/core/frame.py b/pandas/core/frame.py index b6c80a51cec16..5790fe1da454e 100644 --- a/pandas/core/frame.py +++ b/pandas/core/frame.py @@ -4803,8 +4803,8 @@ def insert( elif isinstance(value, DataFrame): value = value.iloc[:, 0] - value, _ = self._sanitize_column(value) - self._mgr.insert(loc, column, value) + value, refs = self._sanitize_column(value, using_cow=using_copy_on_write()) + self._mgr.insert(loc, column, value, refs=refs) def assign(self, **kwargs) -> DataFrame: r""" diff --git a/pandas/tests/copy_view/test_methods.py b/pandas/tests/copy_view/test_methods.py index 7b8bc35f016b1..406b3b3ec1fcb 100644 --- a/pandas/tests/copy_view/test_methods.py +++ b/pandas/tests/copy_view/test_methods.py @@ -1739,3 +1739,18 @@ def test_series_view(using_copy_on_write): else: expected = Series([100, 2, 3]) tm.assert_series_equal(ser, expected) + + +def test_insert_series(using_copy_on_write): + df = DataFrame({"a": [1, 2, 3]}) + ser = Series([1, 2, 3]) + ser_orig = ser.copy() + df.insert(loc=1, value=ser, column="b") + if using_copy_on_write: + assert np.shares_memory(get_array(ser), get_array(df, "b")) + assert not df._mgr._has_no_reference(1) + else: + assert not np.shares_memory(get_array(ser), get_array(df, "b")) + + df.iloc[0, 1] = 100 + tm.assert_series_equal(ser, ser_orig)