@@ -4200,7 +4200,13 @@ def drop(
4200
4200
4201
4201
@final
4202
4202
def _drop_axis (
4203
- self : FrameOrSeries , labels , axis , level = None , errors : str = "raise"
4203
+ self : FrameOrSeries ,
4204
+ labels ,
4205
+ axis ,
4206
+ level = None ,
4207
+ errors : str = "raise" ,
4208
+ consolidate : bool_t = True ,
4209
+ only_slice : bool_t = False ,
4204
4210
) -> FrameOrSeries :
4205
4211
"""
4206
4212
Drop labels from specified axis. Used in the ``drop`` method
@@ -4214,10 +4220,13 @@ def _drop_axis(
4214
4220
For MultiIndex
4215
4221
errors : {'ignore', 'raise'}, default 'raise'
4216
4222
If 'ignore', suppress error and existing labels are dropped.
4223
+ consolidate : bool, default True
4224
+ Whether to call consolidate_inplace in the reindex_indexer call.
4225
+ only_slice : bool, default False
4226
+ Whether indexing along columns should be view-only.
4217
4227
4218
4228
"""
4219
- axis = self ._get_axis_number (axis )
4220
- axis_name = self ._get_axis_name (axis )
4229
+ axis_num = self ._get_axis_number (axis )
4221
4230
axis = self ._get_axis (axis )
4222
4231
4223
4232
if axis .is_unique :
@@ -4227,7 +4236,7 @@ def _drop_axis(
4227
4236
new_axis = axis .drop (labels , level = level , errors = errors )
4228
4237
else :
4229
4238
new_axis = axis .drop (labels , errors = errors )
4230
- result = self . reindex ( ** { axis_name : new_axis } )
4239
+ indexer = axis . get_indexer ( new_axis )
4231
4240
4232
4241
# Case for non-unique axis
4233
4242
else :
@@ -4236,10 +4245,10 @@ def _drop_axis(
4236
4245
if level is not None :
4237
4246
if not isinstance (axis , MultiIndex ):
4238
4247
raise AssertionError ("axis must be a MultiIndex" )
4239
- indexer = ~ axis .get_level_values (level ).isin (labels )
4248
+ mask = ~ axis .get_level_values (level ).isin (labels )
4240
4249
4241
4250
# GH 18561 MultiIndex.drop should raise if label is absent
4242
- if errors == "raise" and indexer .all ():
4251
+ if errors == "raise" and mask .all ():
4243
4252
raise KeyError (f"{ labels } not found in axis" )
4244
4253
elif (
4245
4254
isinstance (axis , MultiIndex )
@@ -4249,20 +4258,31 @@ def _drop_axis(
4249
4258
# Set level to zero in case of MultiIndex and label is string,
4250
4259
# because isin can't handle strings for MultiIndexes GH#36293
4251
4260
# In case of tuples we get dtype object but have to use isin GH#42771
4252
- indexer = ~ axis .get_level_values (0 ).isin (labels )
4261
+ mask = ~ axis .get_level_values (0 ).isin (labels )
4253
4262
else :
4254
- indexer = ~ axis .isin (labels )
4263
+ mask = ~ axis .isin (labels )
4255
4264
# Check if label doesn't exist along axis
4256
4265
labels_missing = (axis .get_indexer_for (labels ) == - 1 ).any ()
4257
4266
if errors == "raise" and labels_missing :
4258
4267
raise KeyError (f"{ labels } not found in axis" )
4259
4268
4260
- slicer = [ slice ( None )] * self . ndim
4261
- slicer [ self . _get_axis_number ( axis_name )] = indexer
4269
+ indexer = mask . nonzero ()[ 0 ]
4270
+ new_axis = axis . take ( indexer )
4262
4271
4263
- result = self .loc [tuple (slicer )]
4272
+ bm_axis = self .ndim - axis_num - 1
4273
+ new_mgr = self ._mgr .reindex_indexer (
4274
+ new_axis ,
4275
+ indexer ,
4276
+ axis = bm_axis ,
4277
+ allow_dups = True ,
4278
+ consolidate = consolidate ,
4279
+ only_slice = only_slice ,
4280
+ )
4281
+ result = self ._constructor (new_mgr )
4282
+ if self .ndim == 1 :
4283
+ result .name = self .name
4264
4284
4265
- return result
4285
+ return result . __finalize__ ( self )
4266
4286
4267
4287
@final
4268
4288
def _update_inplace (self , result , verify_is_copy : bool_t = True ) -> None :
0 commit comments