diff --git a/pandas/core/generic.py b/pandas/core/generic.py index bf79e58077179..f5164abb06ae2 100644 --- a/pandas/core/generic.py +++ b/pandas/core/generic.py @@ -4831,6 +4831,8 @@ def _reindex_axes( copy=copy, allow_dups=False, ) + # If we've made a copy once, no need to make another one + copy = False return obj diff --git a/pandas/core/internals/array_manager.py b/pandas/core/internals/array_manager.py index bd049b80b281c..f215cc656b1d3 100644 --- a/pandas/core/internals/array_manager.py +++ b/pandas/core/internals/array_manager.py @@ -610,6 +610,8 @@ def _reindex_indexer( ) else: arr = self.arrays[i] + if copy: + arr = arr.copy() new_arrays.append(arr) else: diff --git a/pandas/tests/frame/methods/test_reindex.py b/pandas/tests/frame/methods/test_reindex.py index d0765084adfa9..6b73c6a662da7 100644 --- a/pandas/tests/frame/methods/test_reindex.py +++ b/pandas/tests/frame/methods/test_reindex.py @@ -83,6 +83,20 @@ class TestDataFrameSelectReindex: # These are specific reindex-based tests; other indexing tests should go in # test_indexing + def test_reindex_copies(self): + # based on asv time_reindex_axis1 + N = 10 + df = DataFrame(np.random.randn(N * 10, N)) + cols = np.arange(N) + np.random.shuffle(cols) + + result = df.reindex(columns=cols, copy=True) + assert not np.shares_memory(result[0]._values, df[0]._values) + + # pass both columns and index + result2 = df.reindex(columns=cols, index=df.index, copy=True) + assert not np.shares_memory(result2[0]._values, df[0]._values) + def test_reindex_date_fill_value(self): # passing date to dt64 is deprecated arr = date_range("2016-01-01", periods=6).values.reshape(3, 2)