@@ -2890,6 +2890,24 @@ def convert_indexer(start, stop, step, indexer=indexer, codes=level_codes):
28902890
28912891 return m
28922892
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+
28932911 if isinstance (key , slice ):
28942912 # handle a slice, returning a slice if we can
28952913 # otherwise a boolean indexer
@@ -2933,24 +2951,14 @@ def convert_indexer(start, stop, step, indexer=indexer, codes=level_codes):
29332951 j = level_codes .searchsorted (stop , side = "right" )
29342952 return slice (i , j , step )
29352953
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 )
29362959 else :
2937-
29382960 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 )
29542962
29552963 def get_locs (self , seq ):
29562964 """
0 commit comments