@@ -2337,9 +2337,18 @@ def take(
23372337
23382338 Examples
23392339 --------
2340- >>> idx = pd.Index(["a", "b", "c"])
2341- >>> idx.take([2, 2, 1, 2])
2342- Index(['c', 'c', 'b', 'c'], dtype='str')
2340+ >>> idx = pd.MultiIndex.from_arrays([["a", "b", "c"], [1, 2, 3]])
2341+ >>> idx
2342+ MultiIndex([('a', 1),
2343+ ('b', 2),
2344+ ('c', 3)],
2345+ )
2346+ >>> idx.take([2, 2, 1, 0])
2347+ MultiIndex([('c', 3),
2348+ ('c', 3),
2349+ ('b', 2),
2350+ ('a', 1)],
2351+ )
23432352 """
23442353 nv .validate_take ((), kwargs )
23452354 indices = ensure_platform_int (indices )
@@ -2525,13 +2534,28 @@ def repeat(self, repeats: int, axis=None) -> MultiIndex:
25252534
25262535 Examples
25272536 --------
2528- >>> idx = pd.Index([ "a", "b", "c"])
2537+ >>> idx = pd.MultiIndex.from_arrays([[ "a", "b", "c"], [1, 2, 3] ])
25292538 >>> idx
2530- Index(['a', 'b', 'c'], dtype='object')
2539+ MultiIndex([('a', 1),
2540+ ('b', 2),
2541+ ('c', 3)],
2542+ )
25312543 >>> idx.repeat(2)
2532- Index(['a', 'a', 'b', 'b', 'c', 'c'], dtype='object')
2544+ MultiIndex([('a', 1),
2545+ ('a', 1),
2546+ ('b', 2),
2547+ ('b', 2),
2548+ ('c', 3),
2549+ ('c', 3)],
2550+ )
25332551 >>> idx.repeat([1, 2, 3])
2534- Index(['a', 'b', 'b', 'c', 'c', 'c'], dtype='object')
2552+ MultiIndex([('a', 1),
2553+ ('b', 2),
2554+ ('b', 2),
2555+ ('c', 3),
2556+ ('c', 3),
2557+ ('c', 3)],
2558+ )
25352559 """
25362560 nv .validate_repeat ((), {"axis" : axis })
25372561 # error: Incompatible types in assignment (expression has type "ndarray",
@@ -3436,6 +3460,23 @@ def maybe_mi_droplevels(indexer, levels):
34363460
34373461 return new_index
34383462
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+
34393480 if isinstance (level , (tuple , list )):
34403481 if len (key ) != len (level ):
34413482 raise AssertionError (
@@ -3567,6 +3608,18 @@ def maybe_mi_droplevels(indexer, levels):
35673608
35683609 return indexer , result_index
35693610
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+
35703623 def _get_level_indexer (
35713624 self , key , level : int = 0 , indexer : npt .NDArray [np .bool_ ] | None = None
35723625 ):
0 commit comments