From 58a124498faa1ba3d2e26c534b07ab0ed8e4d81b Mon Sep 17 00:00:00 2001 From: Brock Date: Wed, 21 Jul 2021 09:22:02 -0700 Subject: [PATCH 1/2] BUG: ArrayManager reindex with copy=True not copying --- pandas/core/generic.py | 2 ++ pandas/core/internals/array_manager.py | 2 ++ pandas/tests/frame/methods/test_reindex.py | 10 ++++++++++ 3 files changed, 14 insertions(+) diff --git a/pandas/core/generic.py b/pandas/core/generic.py index c63aeb736d16a..c6c4c9a864c8e 100644 --- a/pandas/core/generic.py +++ b/pandas/core/generic.py @@ -4835,6 +4835,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..de81992f61182 100644 --- a/pandas/tests/frame/methods/test_reindex.py +++ b/pandas/tests/frame/methods/test_reindex.py @@ -83,6 +83,16 @@ 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) + 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) From e2c8b2e9353e6ff878910de721d5a4965f472c39 Mon Sep 17 00:00:00 2001 From: Brock Date: Wed, 28 Jul 2021 11:25:06 -0700 Subject: [PATCH 2/2] test case passing both index and columns --- pandas/tests/frame/methods/test_reindex.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/pandas/tests/frame/methods/test_reindex.py b/pandas/tests/frame/methods/test_reindex.py index de81992f61182..6b73c6a662da7 100644 --- a/pandas/tests/frame/methods/test_reindex.py +++ b/pandas/tests/frame/methods/test_reindex.py @@ -93,6 +93,10 @@ def test_reindex_copies(self): 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)