@@ -2890,6 +2890,24 @@ def convert_indexer(start, stop, step, indexer=indexer, codes=level_codes):
2890
2890
2891
2891
return m
2892
2892
2893
+ def search_code_location (code ):
2894
+ # Base on argument ``code``, search where is ``code`` in level's codes
2895
+
2896
+ if level > 0 or self .lexsort_depth == 0 :
2897
+ # Desired level is not sorted
2898
+ locs = np .array (level_codes == code , dtype = bool , copy = False )
2899
+ if not locs .any ():
2900
+ # The label is present in self.levels[level] but unused:
2901
+ raise KeyError (key )
2902
+ return locs
2903
+
2904
+ i = level_codes .searchsorted (code , side = "left" )
2905
+ j = level_codes .searchsorted (code , side = "right" )
2906
+ if i == j :
2907
+ # The label is present in self.levels[level] but unused:
2908
+ raise KeyError (key )
2909
+ return slice (i , j )
2910
+
2893
2911
if isinstance (key , slice ):
2894
2912
# handle a slice, returning a slice if we can
2895
2913
# otherwise a boolean indexer
@@ -2933,24 +2951,14 @@ def convert_indexer(start, stop, step, indexer=indexer, codes=level_codes):
2933
2951
j = level_codes .searchsorted (stop , side = "right" )
2934
2952
return slice (i , j , step )
2935
2953
2954
+ elif not is_list_like (key ) and isna (key ):
2955
+ # missing data's location is denoted by -1
2956
+ # so find missing data's location
2957
+ code = - 1
2958
+ return search_code_location (code )
2936
2959
else :
2937
-
2938
2960
code = level_index .get_loc (key )
2939
-
2940
- if level > 0 or self .lexsort_depth == 0 :
2941
- # Desired level is not sorted
2942
- locs = np .array (level_codes == code , dtype = bool , copy = False )
2943
- if not locs .any ():
2944
- # The label is present in self.levels[level] but unused:
2945
- raise KeyError (key )
2946
- return locs
2947
-
2948
- i = level_codes .searchsorted (code , side = "left" )
2949
- j = level_codes .searchsorted (code , side = "right" )
2950
- if i == j :
2951
- # The label is present in self.levels[level] but unused:
2952
- raise KeyError (key )
2953
- return slice (i , j )
2961
+ return search_code_location (code )
2954
2962
2955
2963
def get_locs (self , seq ):
2956
2964
"""
0 commit comments