Skip to content

Commit 5b7b792

Browse files
StarlessnightxRoxicaro
authored andcommitted
DOC: Update MultiIndex.take and MultiIndex.repeat docstring examples to use MultiIndex (pandas-dev#62809)
1 parent 674e619 commit 5b7b792

File tree

2 files changed

+75
-7
lines changed

2 files changed

+75
-7
lines changed

pandas/core/indexes/multi.py

Lines changed: 60 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -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
):
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
import datetime
2+
3+
import numpy as np
4+
import pytest
5+
6+
import pandas as pd
7+
8+
9+
def test_multiindex_date_npdatetime_mismatch_raises():
10+
idx = pd.MultiIndex.from_product(
11+
[[datetime.date(2023, 11, 1)], ["A"], ["C"]], names=["date", "t1", "t2"]
12+
)
13+
df = pd.DataFrame({"vals": [1]}, index=idx)
14+
with pytest.raises(TypeError, match="Type mismatch"):
15+
df.loc[(np.datetime64("2023-11-01"), "A", "C")]

0 commit comments

Comments
 (0)