diff --git a/doc/source/release.rst b/doc/source/release.rst index 3f148748081b9..97b86703e73b8 100644 --- a/doc/source/release.rst +++ b/doc/source/release.rst @@ -768,7 +768,7 @@ Bug Fixes - Fixed segfault on ``isnull(MultiIndex)`` (now raises an error instead) (:issue:`5123`, :issue:`5125`) - Allow duplicate indices when performing operations that align - (:issue:`5185`) + (:issue:`5185`, :issue:`5639`) - Compound dtypes in a constructor raise ``NotImplementedError`` (:issue:`5191`) - Bug in comparing duplicate frames (:issue:`4421`) related diff --git a/pandas/core/internals.py b/pandas/core/internals.py index 959d0186030cd..e8b18ae93b287 100644 --- a/pandas/core/internals.py +++ b/pandas/core/internals.py @@ -250,10 +250,9 @@ def reindex_items_from(self, new_ref_items, indexer=None, method=None, else: masked_idx = indexer[indexer != -1] + new_items = self.items.take(masked_idx) new_values = com.take_nd(self.values, masked_idx, axis=0, allow_fill=False) - new_items = self.items.take(masked_idx) - # fill if needed if needs_fill: new_values = com.interpolate_2d(new_values, method=method, @@ -3192,7 +3191,8 @@ def reindex_items(self, new_items, indexer=None, copy=True, else: # unique - if self.axes[0].is_unique: + if self.axes[0].is_unique and new_items.is_unique: + for block in self.blocks: newb = block.reindex_items_from(new_items, copy=copy) @@ -3201,7 +3201,7 @@ def reindex_items(self, new_items, indexer=None, copy=True, # non-unique else: - rl = self._set_ref_locs() + rl = self._set_ref_locs(do_refs='force') for i, idx in enumerate(indexer): blk, lidx = rl[idx] item = new_items.take([i]) diff --git a/pandas/tests/test_frame.py b/pandas/tests/test_frame.py index 9d9ebc1b95830..902440ec8e184 100644 --- a/pandas/tests/test_frame.py +++ b/pandas/tests/test_frame.py @@ -3275,6 +3275,15 @@ def check(result, expected=None): expected = DataFrame([[False,True],[True,False],[False,False],[True,False]],columns=['A','A']) assert_frame_equal(result,expected) + # mixed column selection + # GH 5639 + dfbool = DataFrame({'one' : Series([True, True, False], index=['a', 'b', 'c']), + 'two' : Series([False, False, True, False], index=['a', 'b', 'c', 'd']), + 'three': Series([False, True, True, True], index=['a', 'b', 'c', 'd'])}) + expected = pd.concat([dfbool['one'],dfbool['three'],dfbool['one']],axis=1) + result = dfbool[['one', 'three', 'one']] + check(result,expected) + def test_insert_benchmark(self): # from the vb_suite/frame_methods/frame_insert_columns N = 10