Skip to content

Commit e3632f8

Browse files
committed
Merge pull request #5178 from jreback/perf_reindex
PERF: calling get_indexer twice when a specialized indexer (e.g. pad) could be called instead
2 parents 2d1a6ea + 03be3a5 commit e3632f8

File tree

3 files changed

+17
-6
lines changed

3 files changed

+17
-6
lines changed

doc/source/v0.13.0.txt

+1-1
Original file line numberDiff line numberDiff line change
@@ -490,7 +490,7 @@ Enhancements
490490
mask
491491
dfi[mask.any(1)]
492492

493-
:ref:`See the docs<indexing.basics.indexing_isin>` for more.
493+
:ref:`See the docs<indexing.basics.indexing_isin>` for more.
494494

495495
- ``Series`` now supports a ``to_frame`` method to convert it to a single-column DataFrame (:issue:`5164`)
496496

pandas/core/generic.py

+13-2
Original file line numberDiff line numberDiff line change
@@ -1241,8 +1241,19 @@ def _reindex_axes(self, axes, level, limit, method, fill_value, copy, takeable=F
12411241
labels = _ensure_index(labels)
12421242

12431243
axis = self._get_axis_number(a)
1244-
new_index, indexer = self._get_axis(a).reindex(
1245-
labels, level=level, limit=limit, takeable=takeable)
1244+
ax = self._get_axis(a)
1245+
try:
1246+
new_index, indexer = ax.reindex(labels, level=level,
1247+
limit=limit, method=method, takeable=takeable)
1248+
except (ValueError):
1249+
1250+
# catch trying to reindex a non-monotonic index with a specialized indexer
1251+
# e.g. pad, so fallback to the regular indexer
1252+
# this will show up on reindexing a not-naturally ordering series, e.g.
1253+
# Series([1,2,3,4],index=['a','b','c','d']).reindex(['c','b','g'],method='pad')
1254+
new_index, indexer = ax.reindex(labels, level=level,
1255+
limit=limit, method=None, takeable=takeable)
1256+
12461257
obj = obj._reindex_with_indexers(
12471258
{axis: [new_index, indexer]}, method=method, fill_value=fill_value,
12481259
limit=limit, copy=copy)

pandas/core/internals.py

+3-3
Original file line numberDiff line numberDiff line change
@@ -224,6 +224,7 @@ def reindex_items_from(self, new_ref_items, indexer=None, method=None, fill_valu
224224
if indexer is None:
225225
new_ref_items, indexer = self.items.reindex(new_ref_items, limit=limit)
226226

227+
needs_fill = method is not None and limit is None
227228
if fill_value is None:
228229
fill_value = self.fill_value
229230

@@ -245,14 +246,13 @@ def reindex_items_from(self, new_ref_items, indexer=None, method=None, fill_valu
245246
new_items = self.items.take(masked_idx)
246247

247248
# fill if needed
248-
fill_method = method is not None or limit is not None
249-
if fill_method:
249+
if needs_fill:
250250
new_values = com.interpolate_2d(new_values, method=method, limit=limit, fill_value=fill_value)
251251

252252
block = make_block(new_values, new_items, new_ref_items, ndim=self.ndim, fastpath=True)
253253

254254
# down cast if needed
255-
if not self.is_float and (fill_method or notnull(fill_value)):
255+
if not self.is_float and (needs_fill or notnull(fill_value)):
256256
block = block.downcast()
257257

258258
return block

0 commit comments

Comments
 (0)