|
1 | 1 | 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 | +) |
3 | 13 | import warnings
|
4 | 14 |
|
5 | 15 | import numpy as np
|
|
56 | 66 | pprint_thing,
|
57 | 67 | )
|
58 | 68 |
|
| 69 | +if TYPE_CHECKING: |
| 70 | + from pandas import Series # noqa:F401 |
| 71 | + |
59 | 72 | _index_doc_kwargs = dict(ibase._index_doc_kwargs)
|
60 | 73 | _index_doc_kwargs.update(
|
61 | 74 | dict(klass="MultiIndex", target_klass="MultiIndex or list of tuples")
|
@@ -2326,28 +2339,32 @@ def get_value(self, series, key):
|
2326 | 2339 | # We have to explicitly exclude generators, as these are hashable.
|
2327 | 2340 | raise InvalidIndexError(key)
|
2328 | 2341 |
|
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 |
| - |
2343 | 2342 | try:
|
2344 |
| - return _try_mi(key) |
| 2343 | + loc = self.get_loc(key) |
2345 | 2344 | except KeyError:
|
2346 | 2345 | if is_integer(key):
|
2347 |
| - return series._values[key] |
| 2346 | + loc = key |
2348 | 2347 | else:
|
2349 | 2348 | raise
|
2350 | 2349 |
|
| 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 | + |
2351 | 2368 | def _convert_listlike_indexer(self, keyarr):
|
2352 | 2369 | """
|
2353 | 2370 | Parameters
|
|
0 commit comments