Skip to content

Commit 654a810

Browse files
BUG: Correct length_of_indexer for range objects (#63872)
Co-authored-by: Richard Shadrach <45562402+rhshadrach@users.noreply.github.com>
1 parent 04a7012 commit 654a810

File tree

2 files changed

+26
-1
lines changed

2 files changed

+26
-1
lines changed

pandas/core/indexers/utils.py

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -325,7 +325,18 @@ def length_of_indexer(indexer, target=None) -> int:
325325
return indexer.sum()
326326
return len(indexer)
327327
elif isinstance(indexer, range):
328-
return (indexer.stop - indexer.start) // indexer.step
328+
try:
329+
return len(indexer)
330+
except OverflowError:
331+
step = indexer.step
332+
if step > 0:
333+
low, high = indexer.start, indexer.stop
334+
else:
335+
low, high = indexer.stop, indexer.start
336+
step = -step
337+
if low >= high:
338+
return 0
339+
return (high - low - 1) // step + 1
329340
elif not is_list_like_indexer(indexer):
330341
return 1
331342
raise AssertionError("cannot find the length of the indexer")

pandas/tests/indexing/test_indexers.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,20 @@ def test_length_of_indexer():
1616
assert result == 1
1717

1818

19+
@pytest.mark.parametrize(
20+
"start, stop, step, expected",
21+
[
22+
(10, 0, -3, 4),
23+
(0, 1, 5, 1),
24+
],
25+
)
26+
def test_length_of_indexer_range_overflow(start, stop, step, expected):
27+
# https://github.com/pandas-dev/pandas/pull/63872
28+
indexer = range(start, stop, step)
29+
result = length_of_indexer(indexer)
30+
assert result == expected
31+
32+
1933
def test_is_scalar_indexer():
2034
indexer = (0, 1)
2135
assert is_scalar_indexer(indexer, 2)

0 commit comments

Comments
 (0)