Skip to content

Commit 0a288a4

Browse files
authored
REF: simplify BlockManager.idelete (#40548)
1 parent 529c6e9 commit 0a288a4

File tree

3 files changed

+13
-33
lines changed

3 files changed

+13
-33
lines changed

pandas/core/generic.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -4063,7 +4063,7 @@ def __delitem__(self, key) -> None:
40634063
# there was no match, this call should raise the appropriate
40644064
# exception:
40654065
loc = self.axes[-1].get_loc(key)
4066-
self._mgr.idelete(loc)
4066+
self._mgr = self._mgr.idelete(loc)
40674067

40684068
# delete from the caches
40694069
try:

pandas/core/internals/array_manager.py

+3-1
Original file line numberDiff line numberDiff line change
@@ -848,6 +848,7 @@ def idelete(self, indexer):
848848

849849
self.arrays = [self.arrays[i] for i in np.nonzero(to_keep)[0]]
850850
self._axes = [self._axes[0], self._axes[1][to_keep]]
851+
return self
851852

852853
def iset(self, loc: Union[int, slice, np.ndarray], value):
853854
"""
@@ -1247,7 +1248,7 @@ def apply(self, func, **kwargs):
12471248
def setitem(self, indexer, value):
12481249
return self.apply_with_block("setitem", indexer=indexer, value=value)
12491250

1250-
def idelete(self, indexer):
1251+
def idelete(self, indexer) -> SingleArrayManager:
12511252
"""
12521253
Delete selected locations in-place (new array, same ArrayManager)
12531254
"""
@@ -1256,6 +1257,7 @@ def idelete(self, indexer):
12561257

12571258
self.arrays = [self.arrays[0][to_keep]]
12581259
self._axes = [self._axes[0][to_keep]]
1260+
return self
12591261

12601262
def _get_data_subset(self, predicate: Callable) -> ArrayManager:
12611263
# used in get_numeric_data / get_bool_data

pandas/core/internals/managers.py

+9-31
Original file line numberDiff line numberDiff line change
@@ -1046,41 +1046,18 @@ def iget_values(self, i: int) -> ArrayLike:
10461046
values = block.iget(self.blklocs[i])
10471047
return values
10481048

1049-
def idelete(self, indexer):
1049+
def idelete(self, indexer) -> BlockManager:
10501050
"""
1051-
Delete selected locations in-place (new block and array, same BlockManager)
1051+
Delete selected locations, returning a new BlockManager.
10521052
"""
10531053
is_deleted = np.zeros(self.shape[0], dtype=np.bool_)
10541054
is_deleted[indexer] = True
1055-
ref_loc_offset = -is_deleted.cumsum()
1055+
taker = (~is_deleted).nonzero()[0]
10561056

1057-
is_blk_deleted = [False] * len(self.blocks)
1058-
1059-
if isinstance(indexer, int):
1060-
affected_start = indexer
1061-
else:
1062-
affected_start = is_deleted.nonzero()[0][0]
1063-
1064-
for blkno, _ in _fast_count_smallints(self.blknos[affected_start:]):
1065-
blk = self.blocks[blkno]
1066-
bml = blk.mgr_locs
1067-
blk_del = is_deleted[bml.indexer].nonzero()[0]
1068-
1069-
if len(blk_del) == len(bml):
1070-
is_blk_deleted[blkno] = True
1071-
continue
1072-
elif len(blk_del) != 0:
1073-
blk.delete(blk_del)
1074-
bml = blk.mgr_locs
1075-
1076-
blk.mgr_locs = bml.add(ref_loc_offset[bml.indexer])
1077-
1078-
# FIXME: use Index.delete as soon as it uses fastpath=True
1079-
self.axes[0] = self.items[~is_deleted]
1080-
self.blocks = tuple(
1081-
b for blkno, b in enumerate(self.blocks) if not is_blk_deleted[blkno]
1082-
)
1083-
self._rebuild_blknos_and_blklocs()
1057+
nbs = self._slice_take_blocks_ax0(taker, only_slice=True)
1058+
new_columns = self.items[~is_deleted]
1059+
axes = [new_columns, self.axes[1]]
1060+
return type(self)._simple_new(tuple(nbs), axes)
10841061

10851062
def iset(self, loc: Union[int, slice, np.ndarray], value):
10861063
"""
@@ -1683,14 +1660,15 @@ def _consolidate_check(self):
16831660
def _consolidate_inplace(self):
16841661
pass
16851662

1686-
def idelete(self, indexer):
1663+
def idelete(self, indexer) -> SingleBlockManager:
16871664
"""
16881665
Delete single location from SingleBlockManager.
16891666
16901667
Ensures that self.blocks doesn't become empty.
16911668
"""
16921669
self._block.delete(indexer)
16931670
self.axes[0] = self.axes[0].delete(indexer)
1671+
return self
16941672

16951673
def fast_xs(self, loc):
16961674
"""

0 commit comments

Comments
 (0)