Skip to content

Commit c389222

Browse files
authored
REF: turn _try_mi into MultiIndex._get_values_for_loc (#31736)
1 parent 08bdf31 commit c389222

File tree

2 files changed

+38
-19
lines changed

2 files changed

+38
-19
lines changed

pandas/core/indexes/base.py

+4-2
Original file line numberDiff line numberDiff line change
@@ -4597,7 +4597,7 @@ def get_value(self, series: "Series", key):
45974597
else:
45984598
raise
45994599

4600-
return self._get_values_for_loc(series, loc)
4600+
return self._get_values_for_loc(series, loc, key)
46014601

46024602
def _should_fallback_to_positional(self) -> bool:
46034603
"""
@@ -4607,12 +4607,14 @@ def _should_fallback_to_positional(self) -> bool:
46074607
return False
46084608
return True
46094609

4610-
def _get_values_for_loc(self, series: "Series", loc):
4610+
def _get_values_for_loc(self, series: "Series", loc, key):
46114611
"""
46124612
Do a positional lookup on the given Series, returning either a scalar
46134613
or a Series.
46144614
46154615
Assumes that `series.index is self`
4616+
4617+
key is included for MultiIndex compat.
46164618
"""
46174619
if is_integer(loc):
46184620
return series._values[loc]

pandas/core/indexes/multi.py

+34-17
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,15 @@
11
from sys import getsizeof
2-
from typing import Any, Hashable, Iterable, List, Optional, Sequence, Tuple, Union
2+
from typing import (
3+
TYPE_CHECKING,
4+
Any,
5+
Hashable,
6+
Iterable,
7+
List,
8+
Optional,
9+
Sequence,
10+
Tuple,
11+
Union,
12+
)
313
import warnings
414

515
import numpy as np
@@ -56,6 +66,9 @@
5666
pprint_thing,
5767
)
5868

69+
if TYPE_CHECKING:
70+
from pandas import Series # noqa:F401
71+
5972
_index_doc_kwargs = dict(ibase._index_doc_kwargs)
6073
_index_doc_kwargs.update(
6174
dict(klass="MultiIndex", target_klass="MultiIndex or list of tuples")
@@ -2326,28 +2339,32 @@ def get_value(self, series, key):
23262339
# We have to explicitly exclude generators, as these are hashable.
23272340
raise InvalidIndexError(key)
23282341

2329-
def _try_mi(k):
2330-
# TODO: what if a level contains tuples??
2331-
loc = self.get_loc(k)
2332-
2333-
new_values = series._values[loc]
2334-
if is_scalar(loc):
2335-
return new_values
2336-
2337-
new_index = self[loc]
2338-
new_index = maybe_droplevels(new_index, k)
2339-
return series._constructor(
2340-
new_values, index=new_index, name=series.name
2341-
).__finalize__(self)
2342-
23432342
try:
2344-
return _try_mi(key)
2343+
loc = self.get_loc(key)
23452344
except KeyError:
23462345
if is_integer(key):
2347-
return series._values[key]
2346+
loc = key
23482347
else:
23492348
raise
23502349

2350+
return self._get_values_for_loc(series, loc, key)
2351+
2352+
def _get_values_for_loc(self, series: "Series", loc, key):
2353+
"""
2354+
Do a positional lookup on the given Series, returning either a scalar
2355+
or a Series.
2356+
2357+
Assumes that `series.index is self`
2358+
"""
2359+
new_values = series._values[loc]
2360+
if is_scalar(loc):
2361+
return new_values
2362+
2363+
new_index = self[loc]
2364+
new_index = maybe_droplevels(new_index, key)
2365+
new_ser = series._constructor(new_values, index=new_index, name=series.name)
2366+
return new_ser.__finalize__(series)
2367+
23512368
def _convert_listlike_indexer(self, keyarr):
23522369
"""
23532370
Parameters

0 commit comments

Comments
 (0)