@@ -2996,18 +2996,19 @@ def _update_indexer(idxr, indexer=indexer):
2996
2996
return idxr & indexer
2997
2997
2998
2998
need_sort = False
2999
+ indexer = Index (np .arange (n ))
2999
3000
for i , k in enumerate (reversed (seq )):
3000
3001
i = len (seq ) - 1 - i # Counting in reverse
3001
3002
3002
3003
if com .is_bool_indexer (k ):
3003
3004
# a boolean indexer, must be the same length!
3004
3005
k = np .asarray (k )
3005
- indexer = _update_indexer ( _convert_to_indexer (k ), indexer = indexer )
3006
+ indexer = _convert_to_indexer (k ) & indexer
3006
3007
3007
3008
elif is_list_like (k ):
3008
3009
# a collection of labels to include from this level (these
3009
3010
# are or'd)
3010
- indexers = None
3011
+ indexers_union = None
3011
3012
if not need_sort :
3012
3013
# Find out if the list_like label are sorted as the levels or not
3013
3014
k_codes = np .array (
@@ -3024,45 +3025,45 @@ def _update_indexer(idxr, indexer=indexer):
3024
3025
# ordered as previously seen indexes
3025
3026
idxrs = indexer .intersection (idxrs )
3026
3027
3027
- indexers = (
3028
+ indexers_union = (
3028
3029
idxrs
3029
- if indexers is None
3030
- else indexers .union (idxrs , sort = False )
3030
+ if indexers_union is None
3031
+ else indexers_union .union (idxrs , sort = False )
3031
3032
)
3032
3033
except KeyError :
3033
3034
# ignore not founds
3034
3035
continue
3035
3036
3036
- if indexers is not None :
3037
+ if indexers_union is not None :
3037
3038
if need_sort :
3038
- indexer = indexers
3039
+ indexer = indexers_union
3039
3040
else :
3040
- indexer = _update_indexer ( indexers , indexer = indexer )
3041
+ indexer = indexers_union & indexer
3041
3042
else :
3042
3043
# no matches we are done
3043
3044
return Int64Index ([])._ndarray_values
3044
3045
3045
3046
elif com .is_null_slice (k ):
3046
3047
# empty slice
3047
3048
# index is given to conserve the order of this level
3048
- indexer = _update_indexer (Int64Index (np .arange (n )), indexer = indexer )
3049
+ # See test TestMultiIndexSlicers.test_per_axis_per_level_doc_examples in tests/indexings
3050
+ indexer = Int64Index (np .arange (n )) & indexer
3049
3051
3050
3052
elif isinstance (k , slice ):
3051
-
3052
3053
# a slice, include BOTH of the labels
3053
- indexer = _update_indexer (
3054
+ indexer = (
3054
3055
_convert_to_indexer (
3055
3056
self ._get_level_indexer (k , level = i , indexer = indexer )
3056
- ),
3057
- indexer = indexer ,
3057
+ )
3058
+ & indexer
3058
3059
)
3059
3060
else :
3060
3061
# a single label
3061
- indexer = _update_indexer (
3062
+ indexer = (
3062
3063
_convert_to_indexer (
3063
3064
self .get_loc_level (k , level = i , drop_level = False )[0 ]
3064
- ),
3065
- indexer = indexer ,
3065
+ )
3066
+ & indexer
3066
3067
)
3067
3068
3068
3069
# empty indexer
0 commit comments