@@ -2591,7 +2591,7 @@ def _partial_tup_index(self, tup, side="left"):
2591
2591
for k , (lab , lev , labs ) in enumerate (zipped ):
2592
2592
section = labs [start :end ]
2593
2593
2594
- if lab not in lev :
2594
+ if lab not in lev and not isna ( lab ) :
2595
2595
if not lev .is_type_compatible (lib .infer_dtype ([lab ], skipna = False )):
2596
2596
raise TypeError ("Level type mismatch: %s" % lab )
2597
2597
@@ -2601,7 +2601,7 @@ def _partial_tup_index(self, tup, side="left"):
2601
2601
loc -= 1
2602
2602
return start + section .searchsorted (loc , side = side )
2603
2603
2604
- idx = lev .get_loc (lab )
2604
+ idx = lev .get_loc (lab ) if not isna ( lab ) else - 1
2605
2605
if k < n - 1 :
2606
2606
end = start + section .searchsorted (idx , side = "right" )
2607
2607
start = start + section .searchsorted (idx , side = "left" )
@@ -2707,7 +2707,8 @@ def _maybe_to_slice(loc):
2707
2707
loc = np .arange (start , stop , dtype = "int64" )
2708
2708
2709
2709
for i , k in enumerate (follow_key , len (lead_key )):
2710
- mask = self .codes [i ][loc ] == self .levels [i ].get_loc (k )
2710
+ code = self .levels [i ].get_loc (k ) if not isna (k ) else - 1
2711
+ mask = self .codes [i ][loc ] == code
2711
2712
if not mask .all ():
2712
2713
loc = loc [mask ]
2713
2714
if not len (loc ):
@@ -2933,24 +2934,27 @@ def convert_indexer(start, stop, step, indexer=indexer, codes=level_codes):
2933
2934
j = level_codes .searchsorted (stop , side = "right" )
2934
2935
return slice (i , j , step )
2935
2936
2937
+ elif not is_list_like (key ) and isna (key ):
2938
+ # missing data's location is denoted by -1
2939
+ # so find missing data's location
2940
+ code = - 1
2936
2941
else :
2937
-
2938
2942
code = level_index .get_loc (key )
2939
2943
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 :
2944
+ if level > 0 or self .lexsort_depth == 0 :
2945
+ # Desired level is not sorted
2946
+ locs = np .array (level_codes == code , dtype = bool , copy = False )
2947
+ if not locs .any ():
2951
2948
# The label is present in self.levels[level] but unused:
2952
2949
raise KeyError (key )
2953
- return slice (i , j )
2950
+ return locs
2951
+
2952
+ i = level_codes .searchsorted (code , side = "left" )
2953
+ j = level_codes .searchsorted (code , side = "right" )
2954
+ if i == j :
2955
+ # The label is present in self.levels[level] but unused:
2956
+ raise KeyError (key )
2957
+ return slice (i , j )
2954
2958
2955
2959
def get_locs (self , seq ):
2956
2960
"""
0 commit comments