diff --git a/pandas/core/generic.py b/pandas/core/generic.py index fac4ca6768ece..3363d22686f96 100644 --- a/pandas/core/generic.py +++ b/pandas/core/generic.py @@ -3713,7 +3713,8 @@ def __delitem__(self, key) -> None: # If the above loop ran and didn't delete anything because # there was no match, this call should raise the appropriate # exception: - self._mgr.delete(key) + loc = self.axes[-1].get_loc(key) + self._mgr.idelete(loc) # delete from the caches try: diff --git a/pandas/core/internals/managers.py b/pandas/core/internals/managers.py index c6efd6a2ac6a7..b2c43be21771e 100644 --- a/pandas/core/internals/managers.py +++ b/pandas/core/internals/managers.py @@ -1007,12 +1007,10 @@ def iget(self, i: int) -> "SingleBlockManager": self.axes[1], ) - def delete(self, item): + def idelete(self, indexer): """ - Delete selected item (items if non-unique) in-place. + Delete selected locations in-place (new block and array, same BlockManager) """ - indexer = self.items.get_loc(item) - is_deleted = np.zeros(self.shape[0], dtype=np.bool_) is_deleted[indexer] = True ref_loc_offset = -is_deleted.cumsum() @@ -1606,15 +1604,14 @@ def _consolidate_check(self): def _consolidate_inplace(self): pass - def delete(self, item): + def idelete(self, indexer): """ - Delete single item from SingleBlockManager. + Delete single location from SingleBlockManager. Ensures that self.blocks doesn't become empty. """ - loc = self.items.get_loc(item) - self._block.delete(loc) - self.axes[0] = self.axes[0].delete(loc) + self._block.delete(indexer) + self.axes[0] = self.axes[0].delete(indexer) def fast_xs(self, loc): """