Skip to content

Commit cefafd4

Browse files
authored
PERF: reindex with MultiIndex (#46235)
1 parent 980edae commit cefafd4

File tree

3 files changed

+10
-2
lines changed

3 files changed

+10
-2
lines changed

asv_bench/benchmarks/reindex.py

+7-1
Original file line numberDiff line numberDiff line change
@@ -28,16 +28,22 @@ def setup(self):
2828
index = MultiIndex.from_arrays([level1, level2])
2929
self.s = Series(np.random.randn(N * K), index=index)
3030
self.s_subset = self.s[::2]
31+
self.s_subset_no_cache = self.s[::2].copy()
3132

3233
def time_reindex_dates(self):
3334
self.df.reindex(self.rng_subset)
3435

3536
def time_reindex_columns(self):
3637
self.df2.reindex(columns=self.df.columns[1:5])
3738

38-
def time_reindex_multiindex(self):
39+
def time_reindex_multiindex_with_cache(self):
40+
# MultiIndex._values gets cached
3941
self.s.reindex(self.s_subset.index)
4042

43+
def time_reindex_multiindex_no_cache(self):
44+
# Copy to avoid MultiIndex._values getting cached
45+
self.s.reindex(self.s_subset_no_cache.index.copy())
46+
4147

4248
class ReindexMethod:
4349

doc/source/whatsnew/v1.5.0.rst

+1
Original file line numberDiff line numberDiff line change
@@ -298,6 +298,7 @@ Performance improvements
298298
- Performance improvement in :meth:`MultiIndex.get_locs` (:issue:`45681`, :issue:`46040`)
299299
- Performance improvement in :func:`merge` when left and/or right are empty (:issue:`45838`)
300300
- Performance improvement in :meth:`DataFrame.join` when left and/or right are empty (:issue:`46015`)
301+
- Performance improvement in :meth:`DataFrame.reindex` and :meth:`Series.reindex` when target is a :class:`MultiIndex` (:issue:`46235`)
301302
- Performance improvement in :func:`factorize` (:issue:`46109`)
302303
- Performance improvement in :class:`DataFrame` and :class:`Series` constructors for extension dtype scalars (:issue:`45854`)
303304

pandas/core/indexes/base.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -3922,14 +3922,15 @@ def _get_indexer(
39223922
elif method == "nearest":
39233923
indexer = self._get_nearest_indexer(target, limit, tolerance)
39243924
else:
3925-
tgt_values = target._get_engine_target()
39263925
if target._is_multi and self._is_multi:
39273926
engine = self._engine
39283927
# error: Item "IndexEngine" of "Union[IndexEngine, ExtensionEngine]"
39293928
# has no attribute "_extract_level_codes"
39303929
tgt_values = engine._extract_level_codes( # type: ignore[union-attr]
39313930
target
39323931
)
3932+
else:
3933+
tgt_values = target._get_engine_target()
39333934

39343935
# error: Argument 1 to "get_indexer" of "IndexEngine" has incompatible
39353936
# type "Union[ExtensionArray, ndarray[Any, Any]]"; expected

0 commit comments

Comments
 (0)