@@ -3460,6 +3460,23 @@ def maybe_mi_droplevels(indexer, levels):
34603460
34613461 return new_index
34623462
3463+ # type-check key against level(s), raise error if mismatch
3464+ if isinstance (key , tuple ):
3465+ for i , k in enumerate (key ):
3466+ if not self ._is_key_type_compatible (k , i ):
3467+ raise TypeError (
3468+ f"Type mismatch at index level { i } : "
3469+ f"expected { type (self .levels [i ][0 ]).__name__ } , "
3470+ f"got { type (k ).__name__ } "
3471+ )
3472+ else :
3473+ if not self ._is_key_type_compatible (key , level ):
3474+ raise TypeError (
3475+ f"Type mismatch at index level { level } : "
3476+ f"expected { type (self .levels [level ][0 ]).__name__ } , "
3477+ f"got { type (key ).__name__ } "
3478+ )
3479+
34633480 if isinstance (level , (tuple , list )):
34643481 if len (key ) != len (level ):
34653482 raise AssertionError (
@@ -3591,6 +3608,18 @@ def maybe_mi_droplevels(indexer, levels):
35913608
35923609 return indexer , result_index
35933610
3611+ def _is_key_type_compatible (self , key , level ):
3612+ """
3613+ Return True if the key type is compatible with the type of the level's values.
3614+ """
3615+ if len (self .levels [level ]) == 0 :
3616+ return True # nothing to compare
3617+ level_type = type (self .levels [level ][0 ])
3618+
3619+ # Same type → OK
3620+ if isinstance (key , level_type ):
3621+ return True
3622+
35943623 def _get_level_indexer (
35953624 self , key , level : int = 0 , indexer : npt .NDArray [np .bool_ ] | None = None
35963625 ):
0 commit comments