@@ -3048,18 +3048,19 @@ def _update_indexer(idxr, indexer=indexer):
3048
3048
return idxr & indexer
3049
3049
3050
3050
need_sort = False
3051
+ indexer = Index (np .arange (n ))
3051
3052
for i , k in enumerate (reversed (seq )):
3052
3053
i = len (seq ) - 1 - i # Counting in reverse
3053
3054
3054
3055
if com .is_bool_indexer (k ):
3055
3056
# a boolean indexer, must be the same length!
3056
3057
k = np .asarray (k )
3057
- indexer = _update_indexer ( _convert_to_indexer (k ), indexer = indexer )
3058
+ indexer = _convert_to_indexer (k ) & indexer
3058
3059
3059
3060
elif is_list_like (k ):
3060
3061
# a collection of labels to include from this level (these
3061
3062
# are or'd)
3062
- indexers = None
3063
+ indexers_union = None
3063
3064
if not need_sort :
3064
3065
# Find out if the list_like label are sorted as the levels or not
3065
3066
k_codes = np .array (
@@ -3076,45 +3077,45 @@ def _update_indexer(idxr, indexer=indexer):
3076
3077
# ordered as previously seen indexes
3077
3078
idxrs = indexer .intersection (idxrs )
3078
3079
3079
- indexers = (
3080
+ indexers_union = (
3080
3081
idxrs
3081
- if indexers is None
3082
- else indexers .union (idxrs , sort = False )
3082
+ if indexers_union is None
3083
+ else indexers_union .union (idxrs , sort = False )
3083
3084
)
3084
3085
except KeyError :
3085
3086
# ignore not founds
3086
3087
continue
3087
3088
3088
- if indexers is not None :
3089
+ if indexers_union is not None :
3089
3090
if need_sort :
3090
- indexer = indexers
3091
+ indexer = indexers_union
3091
3092
else :
3092
- indexer = _update_indexer ( indexers , indexer = indexer )
3093
+ indexer = indexers_union & indexer
3093
3094
else :
3094
3095
# no matches we are done
3095
3096
return Int64Index ([])._ndarray_values
3096
3097
3097
3098
elif com .is_null_slice (k ):
3098
3099
# empty slice
3099
3100
# index is given to conserve the order of this level
3100
- indexer = _update_indexer (Int64Index (np .arange (n )), indexer = indexer )
3101
+ # See test TestMultiIndexSlicers.test_per_axis_per_level_doc_examples in tests/indexings
3102
+ indexer = Int64Index (np .arange (n )) & indexer
3101
3103
3102
3104
elif isinstance (k , slice ):
3103
-
3104
3105
# a slice, include BOTH of the labels
3105
- indexer = _update_indexer (
3106
+ indexer = (
3106
3107
_convert_to_indexer (
3107
3108
self ._get_level_indexer (k , level = i , indexer = indexer )
3108
- ),
3109
- indexer = indexer ,
3109
+ )
3110
+ & indexer
3110
3111
)
3111
3112
else :
3112
3113
# a single label
3113
- indexer = _update_indexer (
3114
+ indexer = (
3114
3115
_convert_to_indexer (
3115
3116
self .get_loc_level (k , level = i , drop_level = False )[0 ]
3116
- ),
3117
- indexer = indexer ,
3117
+ )
3118
+ & indexer
3118
3119
)
3119
3120
3120
3121
# empty indexer
0 commit comments