Skip to content

Commit 4c6feae

Browse files
authored
BUG in reindex raises IndexingError when df is empty sometimes (#37874)
1 parent 2d40186 commit 4c6feae

File tree

3 files changed

+23
-2
lines changed

3 files changed

+23
-2
lines changed

doc/source/whatsnew/v1.2.0.rst

+1
Original file line numberDiff line numberDiff line change
@@ -586,6 +586,7 @@ Indexing
586586
- Bug in :meth:`DataFrame.loc` returned requested key plus missing values when ``loc`` was applied to single level from :class:`MultiIndex` (:issue:`27104`)
587587
- Bug in indexing on a :class:`Series` or :class:`DataFrame` with a :class:`CategoricalIndex` using a listlike indexer containing NA values (:issue:`37722`)
588588
- Bug in :meth:`DataFrame.xs` ignored ``droplevel=False`` for columns (:issue:`19056`)
589+
- Bug in :meth:`DataFrame.reindex` raising ``IndexingError`` wrongly for empty :class:`DataFrame` with ``tolerance`` not None or ``method="nearest"`` (:issue:`27315`)
589590

590591
Missing
591592
^^^^^^^

pandas/core/indexes/base.py

+4-1
Original file line numberDiff line numberDiff line change
@@ -3170,7 +3170,7 @@ def _get_fill_indexer(
31703170
indexer = engine_method(target_values, limit)
31713171
else:
31723172
indexer = self._get_fill_indexer_searchsorted(target, method, limit)
3173-
if tolerance is not None:
3173+
if tolerance is not None and len(self):
31743174
indexer = self._filter_indexer_tolerance(target_values, indexer, tolerance)
31753175
return indexer
31763176

@@ -3215,6 +3215,9 @@ def _get_nearest_indexer(self, target: "Index", limit, tolerance) -> np.ndarray:
32153215
values that can be subtracted from each other (e.g., not strings or
32163216
tuples).
32173217
"""
3218+
if not len(self):
3219+
return self._get_fill_indexer(target, "pad")
3220+
32183221
left_indexer = self.get_indexer(target, "pad", limit=limit)
32193222
right_indexer = self.get_indexer(target, "backfill", limit=limit)
32203223

pandas/tests/frame/methods/test_reindex.py

+18-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from datetime import datetime
1+
from datetime import datetime, timedelta
22
import inspect
33
from itertools import permutations
44

@@ -874,3 +874,20 @@ def test_reindex_multiindex_ffill_added_rows(self):
874874
result = df.reindex(mi2, axis=0, method="ffill")
875875
expected = DataFrame([[0, 7], [3, 4], [3, 4]], index=mi2, columns=["x", "y"])
876876
tm.assert_frame_equal(result, expected)
877+
878+
@pytest.mark.parametrize(
879+
"kwargs",
880+
[
881+
{"method": "pad", "tolerance": timedelta(seconds=9)},
882+
{"method": "backfill", "tolerance": timedelta(seconds=9)},
883+
{"method": "nearest"},
884+
{"method": None},
885+
],
886+
)
887+
def test_reindex_empty_frame(self, kwargs):
888+
# GH#27315
889+
idx = date_range(start="2020", freq="30s", periods=3)
890+
df = DataFrame([], index=Index([], name="time"), columns=["a"])
891+
result = df.reindex(idx, **kwargs)
892+
expected = DataFrame({"a": [pd.NA] * 3}, index=idx)
893+
tm.assert_frame_equal(result, expected)

0 commit comments

Comments
 (0)