From 47eeefb6457c0df35057736c93b982ef7797b760 Mon Sep 17 00:00:00 2001 From: jbrockmendel Date: Mon, 3 Feb 2020 18:06:16 -0800 Subject: [PATCH] CLN: prelims for MultiIndex.get_value --- pandas/core/indexes/multi.py | 36 +++++++++++++++++++++++++----------- 1 file changed, 25 insertions(+), 11 deletions(-) diff --git a/pandas/core/indexes/multi.py b/pandas/core/indexes/multi.py index c560d81ba95f6..1d18207c99e2e 100644 --- a/pandas/core/indexes/multi.py +++ b/pandas/core/indexes/multi.py @@ -1,6 +1,16 @@ import datetime from sys import getsizeof -from typing import Any, Hashable, Iterable, List, Optional, Sequence, Tuple, Union +from typing import ( + TYPE_CHECKING, + Any, + Hashable, + Iterable, + List, + Optional, + Sequence, + Tuple, + Union, +) import warnings import numpy as np @@ -28,7 +38,7 @@ pandas_dtype, ) from pandas.core.dtypes.dtypes import ExtensionDtype -from pandas.core.dtypes.generic import ABCDataFrame +from pandas.core.dtypes.generic import ABCDataFrame, ABCSeries from pandas.core.dtypes.missing import array_equivalent, isna import pandas.core.algorithms as algos @@ -57,6 +67,9 @@ pprint_thing, ) +if TYPE_CHECKING: + from pandas import Series # noqa:F401 + _index_doc_kwargs = dict(ibase._index_doc_kwargs) _index_doc_kwargs.update( dict(klass="MultiIndex", target_klass="MultiIndex or list of tuples") @@ -2313,11 +2326,18 @@ def reindex(self, target, method=None, level=None, limit=None, tolerance=None): # -------------------------------------------------------------------- # Indexing Methods - def get_value(self, series, key): + def get_value(self, series: "Series", key): # Label-based + assert isinstance(series, ABCSeries) + s = com.values_from_object(series) k = com.values_from_object(key) + if is_iterator(key): + # Unlike other Index classes, we accept non-scalar, but do + # exclude generators. + raise InvalidIndexError(key) + def _try_mi(k): # TODO: what if a level contains tuples?? loc = self.get_loc(k) @@ -2326,7 +2346,7 @@ def _try_mi(k): new_index = maybe_droplevels(new_index, k) return series._constructor( new_values, index=new_index, name=series.name - ).__finalize__(self) + ).__finalize__(series) try: return self._engine.get_value(s, k) @@ -2340,13 +2360,7 @@ def _try_mi(k): return libindex.get_value_at(s, k) except IndexError: raise - except TypeError: - # generator/iterator-like - if is_iterator(key): - raise InvalidIndexError(key) - else: - raise e1 - except Exception: # pragma: no cover + except Exception: raise e1 except TypeError: