@@ -3042,6 +3042,7 @@ def _update_indexer(idxr, indexer=indexer):
3042
3042
return indexer
3043
3043
return idxr & indexer
3044
3044
3045
+ need_sort = False
3045
3046
for i , k in enumerate (reversed (seq )):
3046
3047
i = len (seq ) - 1 - i # Counting in reverse
3047
3048
@@ -3054,14 +3055,19 @@ def _update_indexer(idxr, indexer=indexer):
3054
3055
# a collection of labels to include from this level (these
3055
3056
# are or'd)
3056
3057
indexers = None
3058
+ # Find out if the list_like label are sorted as the levels or not
3059
+ k_codes = np .array (
3060
+ [self .levels [i ].get_loc (e ) for e in k if e in self .levels [i ]]
3061
+ )
3062
+ need_sort = not (k_codes [:- 1 ] < k_codes [1 :]).all ()
3057
3063
for x in k :
3058
3064
try :
3059
3065
idxrs = _convert_to_indexer (
3060
3066
self ._get_level_indexer (x , level = i , indexer = indexer )
3061
3067
)
3062
- # We intersect with indexer to make idxrs
3063
- # ordered as previously seen indexes
3064
- if indexer is not None :
3068
+ if need_sort and indexer is not None :
3069
+ # We intersect with indexer to make idxrs
3070
+ # ordered as previously seen indexes
3065
3071
idxrs = indexer .intersection (idxrs )
3066
3072
3067
3073
indexers = (
@@ -3074,8 +3080,10 @@ def _update_indexer(idxr, indexer=indexer):
3074
3080
continue
3075
3081
3076
3082
if indexers is not None :
3077
- # No need to update anymore, as we intersect in main loop
3078
- indexer = indexers
3083
+ if need_sort :
3084
+ indexer = indexers
3085
+ else :
3086
+ indexer = _update_indexer (indexers , indexer = indexer )
3079
3087
else :
3080
3088
# no matches we are done
3081
3089
return Int64Index ([])._ndarray_values
0 commit comments