@@ -2995,6 +2995,7 @@ def _update_indexer(idxr, indexer=indexer):
2995
2995
return indexer
2996
2996
return idxr & indexer
2997
2997
2998
+ need_sort = False
2998
2999
for i , k in enumerate (reversed (seq )):
2999
3000
i = len (seq ) - 1 - i # Counting in reverse
3000
3001
@@ -3007,14 +3008,19 @@ def _update_indexer(idxr, indexer=indexer):
3007
3008
# a collection of labels to include from this level (these
3008
3009
# are or'd)
3009
3010
indexers = None
3011
+ # Find out if the list_like label are sorted as the levels or not
3012
+ k_codes = np .array (
3013
+ [self .levels [i ].get_loc (e ) for e in k if e in self .levels [i ]]
3014
+ )
3015
+ need_sort = not (k_codes [:- 1 ] < k_codes [1 :]).all ()
3010
3016
for x in k :
3011
3017
try :
3012
3018
idxrs = _convert_to_indexer (
3013
3019
self ._get_level_indexer (x , level = i , indexer = indexer )
3014
3020
)
3015
- # We intersect with indexer to make idxrs
3016
- # ordered as previously seen indexes
3017
- if indexer is not None :
3021
+ if need_sort and indexer is not None :
3022
+ # We intersect with indexer to make idxrs
3023
+ # ordered as previously seen indexes
3018
3024
idxrs = indexer .intersection (idxrs )
3019
3025
3020
3026
indexers = (
@@ -3027,8 +3033,10 @@ def _update_indexer(idxr, indexer=indexer):
3027
3033
continue
3028
3034
3029
3035
if indexers is not None :
3030
- # No need to update anymore, as we intersect in main loop
3031
- indexer = indexers
3036
+ if need_sort :
3037
+ indexer = indexers
3038
+ else :
3039
+ indexer = _update_indexer (indexers , indexer = indexer )
3032
3040
else :
3033
3041
# no matches we are done
3034
3042
return Int64Index ([])._ndarray_values
0 commit comments