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