Skip to content

Commit 5c761f1

Browse files
Dr-Irvjreback
authored andcommitted
BUG: Series.get() with ExtensionArray and integer index (#21260)
1 parent a3e56f2 commit 5c761f1

File tree

4 files changed

+57
-4
lines changed

4 files changed

+57
-4
lines changed

doc/source/whatsnew/v0.24.0.txt

+1
Original file line numberDiff line numberDiff line change
@@ -317,6 +317,7 @@ Reshaping
317317
ExtensionArray
318318
^^^^^^^^^^^^^^
319319

320+
- Bug in :meth:`Series.get` for ``Series`` using ``ExtensionArray`` and integer index (:issue:`21257`)
320321
- :meth:`Series.combine()` works correctly with :class:`~pandas.api.extensions.ExtensionArray` inside of :class:`Series` (:issue:`20825`)
321322
- :meth:`Series.combine()` with scalar argument now works for any function type (:issue:`21248`)
322323
-

pandas/core/indexes/base.py

+7-3
Original file line numberDiff line numberDiff line change
@@ -2988,16 +2988,20 @@ def get_value(self, series, key):
29882988
# use this, e.g. DatetimeIndex
29892989
s = getattr(series, '_values', None)
29902990
if isinstance(s, (ExtensionArray, Index)) and is_scalar(key):
2991-
# GH 20825
2991+
# GH 20882, 21257
29922992
# Unify Index and ExtensionArray treatment
29932993
# First try to convert the key to a location
2994-
# If that fails, see if key is an integer, and
2994+
# If that fails, raise a KeyError if an integer
2995+
# index, otherwise, see if key is an integer, and
29952996
# try that
29962997
try:
29972998
iloc = self.get_loc(key)
29982999
return s[iloc]
29993000
except KeyError:
3000-
if is_integer(key):
3001+
if (len(self) > 0 and
3002+
self.inferred_type in ['integer', 'boolean']):
3003+
raise
3004+
elif is_integer(key):
30013005
return s[key]
30023006

30033007
s = com._values_from_object(series)

pandas/tests/extension/base/getitem.py

+6-1
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,7 @@ def test_get(self, data):
130130
expected = s.iloc[[0, 1]]
131131
self.assert_series_equal(result, expected)
132132

133-
assert s.get(-1) == s.iloc[-1]
133+
assert s.get(-1) is None
134134
assert s.get(s.index.max() + 1) is None
135135

136136
s = pd.Series(data[:6], index=list('abcdef'))
@@ -147,6 +147,11 @@ def test_get(self, data):
147147
assert s.get(-1) == s.iloc[-1]
148148
assert s.get(len(s)) is None
149149

150+
# GH 21257
151+
s = pd.Series(data)
152+
s2 = s[::2]
153+
assert s2.get(1) is None
154+
150155
def test_take_sequence(self, data):
151156
result = pd.Series(data)[[0, 1, 3]]
152157
assert result.iloc[0] == data[0]

pandas/tests/series/indexing/test_indexing.py

+43
Original file line numberDiff line numberDiff line change
@@ -187,6 +187,49 @@ def test_getitem_box_float64(test_data):
187187
assert isinstance(value, np.float64)
188188

189189

190+
@pytest.mark.parametrize(
191+
'arr',
192+
[
193+
np.random.randn(10),
194+
tm.makeDateIndex(10, name='a').tz_localize(
195+
tz='US/Eastern'),
196+
])
197+
def test_get(arr):
198+
# GH 21260
199+
s = Series(arr, index=[2 * i for i in range(len(arr))])
200+
assert s.get(4) == s.iloc[2]
201+
202+
result = s.get([4, 6])
203+
expected = s.iloc[[2, 3]]
204+
tm.assert_series_equal(result, expected)
205+
206+
result = s.get(slice(2))
207+
expected = s.iloc[[0, 1]]
208+
tm.assert_series_equal(result, expected)
209+
210+
assert s.get(-1) is None
211+
assert s.get(s.index.max() + 1) is None
212+
213+
s = Series(arr[:6], index=list('abcdef'))
214+
assert s.get('c') == s.iloc[2]
215+
216+
result = s.get(slice('b', 'd'))
217+
expected = s.iloc[[1, 2, 3]]
218+
tm.assert_series_equal(result, expected)
219+
220+
result = s.get('Z')
221+
assert result is None
222+
223+
assert s.get(4) == s.iloc[4]
224+
assert s.get(-1) == s.iloc[-1]
225+
assert s.get(len(s)) is None
226+
227+
# GH 21257
228+
s = pd.Series(arr)
229+
s2 = s[::2]
230+
assert s2.get(1) is None
231+
232+
190233
def test_series_box_timestamp():
191234
rng = pd.date_range('20090415', '20090519', freq='B')
192235
ser = Series(rng)

0 commit comments

Comments
 (0)