@@ -3224,8 +3224,8 @@ def convert_indexer(start, stop, step, indexer=indexer, codes=level_codes):
3224
3224
return convert_indexer (start , stop + 1 , step )
3225
3225
else :
3226
3226
# sorted, so can return slice object -> view
3227
- i = level_codes .searchsorted (start , side = "left" )
3228
- j = level_codes .searchsorted (stop , side = "right" )
3227
+ i = algos .searchsorted (level_codes , start , side = "left" )
3228
+ j = algos .searchsorted (level_codes , stop , side = "right" )
3229
3229
return slice (i , j , step )
3230
3230
3231
3231
else :
@@ -3248,12 +3248,12 @@ def convert_indexer(start, stop, step, indexer=indexer, codes=level_codes):
3248
3248
3249
3249
if isinstance (idx , slice ):
3250
3250
# e.g. test_partial_string_timestamp_multiindex
3251
- start = level_codes .searchsorted (idx .start , side = "left" )
3251
+ start = algos .searchsorted (level_codes , idx .start , side = "left" )
3252
3252
# NB: "left" here bc of slice semantics
3253
- end = level_codes .searchsorted (idx .stop , side = "left" )
3253
+ end = algos .searchsorted (level_codes , idx .stop , side = "left" )
3254
3254
else :
3255
- start = level_codes .searchsorted (idx , side = "left" )
3256
- end = level_codes .searchsorted (idx , side = "right" )
3255
+ start = algos .searchsorted (level_codes , idx , side = "left" )
3256
+ end = algos .searchsorted (level_codes , idx , side = "right" )
3257
3257
3258
3258
if start == end :
3259
3259
# The label is present in self.levels[level] but unused:
@@ -3304,10 +3304,10 @@ def get_locs(self, seq):
3304
3304
)
3305
3305
3306
3306
n = len (self )
3307
- # indexer is the list of all positions that we want to take; we
3308
- # start with it being everything and narrow it down as we look at each
3309
- # entry in `seq`
3310
- indexer = Index ( np . arange ( n ))
3307
+ # indexer is the list of all positions that we want to take; it
3308
+ # is created on the first entry in seq and narrowed down as we
3309
+ # look at remaining entries
3310
+ indexer = None
3311
3311
3312
3312
if any (x is Ellipsis for x in seq ):
3313
3313
raise NotImplementedError (
@@ -3330,7 +3330,9 @@ def _convert_to_indexer(r) -> Int64Index:
3330
3330
r = r .nonzero ()[0 ]
3331
3331
return Int64Index (r )
3332
3332
3333
- def _update_indexer (idxr : Index , indexer : Index ) -> Index :
3333
+ def _update_indexer (idxr : Index , indexer : Index | None ) -> Index :
3334
+ if indexer is None :
3335
+ return idxr
3334
3336
indexer_intersection = indexer .intersection (idxr )
3335
3337
if indexer_intersection .empty and not idxr .empty and not indexer .empty :
3336
3338
raise KeyError (seq )
@@ -3415,7 +3417,8 @@ def _update_indexer(idxr: Index, indexer: Index) -> Index:
3415
3417
3416
3418
elif com .is_null_slice (k ):
3417
3419
# empty slice
3418
- pass
3420
+ if indexer is None :
3421
+ indexer = Index (np .arange (n ))
3419
3422
3420
3423
elif isinstance (k , slice ):
3421
3424
0 commit comments