Skip to content

Commit 551d933

Browse files
StarlessnightxRoxicaro
authored andcommitted
DOC: Update MultiIndex.take and MultiIndex.repeat docstring examples to use MultiIndex (pandas-dev#62809)
1 parent 50bab2e commit 551d933

File tree

2 files changed

+44
-0
lines changed

2 files changed

+44
-0
lines changed

pandas/core/indexes/multi.py

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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
):
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)