diff --git a/pandas/core/indexes/base.py b/pandas/core/indexes/base.py index 90ef80c958610..7837faf5b4c0f 100644 --- a/pandas/core/indexes/base.py +++ b/pandas/core/indexes/base.py @@ -3082,12 +3082,17 @@ def get_value(self, series, key): # use this, e.g. DatetimeIndex s = getattr(series, '_values', None) if isinstance(s, (ExtensionArray, Index)) and is_scalar(key): + # GH 20825 + # Unify Index and ExtensionArray treatment + # First try to convert the key to a location + # If that fails, see if key is an integer, and + # try that try: - return s[key] - except (IndexError, ValueError): - - # invalid type as an indexer - pass + iloc = self.get_loc(key) + return s[iloc] + except KeyError: + if is_integer(key): + return s[key] s = com._values_from_object(series) k = com._values_from_object(key) diff --git a/pandas/tests/extension/base/getitem.py b/pandas/tests/extension/base/getitem.py index 5c9ede1079079..883b3f5588aef 100644 --- a/pandas/tests/extension/base/getitem.py +++ b/pandas/tests/extension/base/getitem.py @@ -117,6 +117,36 @@ def test_getitem_slice(self, data): result = data[slice(1)] # scalar assert isinstance(result, type(data)) + def test_get(self, data): + # GH 20882 + s = pd.Series(data, index=[2 * i for i in range(len(data))]) + assert s.get(4) == s.iloc[2] + + result = s.get([4, 6]) + expected = s.iloc[[2, 3]] + self.assert_series_equal(result, expected) + + result = s.get(slice(2)) + expected = s.iloc[[0, 1]] + self.assert_series_equal(result, expected) + + assert s.get(-1) == s.iloc[-1] + assert s.get(s.index.max() + 1) is None + + s = pd.Series(data[:6], index=list('abcdef')) + assert s.get('c') == s.iloc[2] + + result = s.get(slice('b', 'd')) + expected = s.iloc[[1, 2, 3]] + self.assert_series_equal(result, expected) + + result = s.get('Z') + assert result is None + + assert s.get(4) == s.iloc[4] + assert s.get(-1) == s.iloc[-1] + assert s.get(len(s)) is None + def test_take_sequence(self, data): result = pd.Series(data)[[0, 1, 3]] assert result.iloc[0] == data[0]