@@ -1046,41 +1046,18 @@ def iget_values(self, i: int) -> ArrayLike:
1046
1046
values = block .iget (self .blklocs [i ])
1047
1047
return values
1048
1048
1049
- def idelete (self , indexer ):
1049
+ def idelete (self , indexer ) -> BlockManager :
1050
1050
"""
1051
- Delete selected locations in-place ( new block and array, same BlockManager)
1051
+ Delete selected locations, returning a new BlockManager.
1052
1052
"""
1053
1053
is_deleted = np .zeros (self .shape [0 ], dtype = np .bool_ )
1054
1054
is_deleted [indexer ] = True
1055
- ref_loc_offset = - is_deleted . cumsum ()
1055
+ taker = ( ~ is_deleted ). nonzero ()[ 0 ]
1056
1056
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 )
1084
1061
1085
1062
def iset (self , loc : Union [int , slice , np .ndarray ], value ):
1086
1063
"""
@@ -1683,14 +1660,15 @@ def _consolidate_check(self):
1683
1660
def _consolidate_inplace (self ):
1684
1661
pass
1685
1662
1686
- def idelete (self , indexer ):
1663
+ def idelete (self , indexer ) -> SingleBlockManager :
1687
1664
"""
1688
1665
Delete single location from SingleBlockManager.
1689
1666
1690
1667
Ensures that self.blocks doesn't become empty.
1691
1668
"""
1692
1669
self ._block .delete (indexer )
1693
1670
self .axes [0 ] = self .axes [0 ].delete (indexer )
1671
+ return self
1694
1672
1695
1673
def fast_xs (self , loc ):
1696
1674
"""
0 commit comments