Skip to content

Commit 05d5c9d

Browse files
committed
Backport PR pandas-dev#42270: PERF: CategoricalIndex.get_indexer
1 parent 4742f53 commit 05d5c9d

File tree

1 file changed

+16
-3
lines changed

1 file changed

+16
-3
lines changed

pandas/core/indexes/base.py

+16-3
Original file line numberDiff line numberDiff line change
@@ -3407,12 +3407,25 @@ def get_indexer(
34073407
# matched to Interval scalars
34083408
return self._get_indexer_non_comparable(target, method=method, unique=True)
34093409

3410+
if is_categorical_dtype(self.dtype):
3411+
# _maybe_cast_listlike_indexer ensures target has our dtype
3412+
# (could improve perf by doing _should_compare check earlier?)
3413+
assert is_dtype_equal(self.dtype, target.dtype)
3414+
3415+
indexer = self._engine.get_indexer(target.codes)
3416+
if self.hasnans and target.hasnans:
3417+
loc = self.get_loc(np.nan)
3418+
mask = target.isna()
3419+
indexer[mask] = loc
3420+
return indexer
3421+
34103422
if is_categorical_dtype(target.dtype):
34113423
# potential fastpath
34123424
# get an indexer for unique categories then propagate to codes via take_nd
3413-
# Note: calling get_indexer instead of _get_indexer causes
3414-
# RecursionError GH#42088
3415-
categories_indexer = self._get_indexer(target.categories)
3425+
# get_indexer instead of _get_indexer needed for MultiIndex cases
3426+
# e.g. test_append_different_columns_types
3427+
categories_indexer = self.get_indexer(target.categories)
3428+
34163429
indexer = algos.take_nd(categories_indexer, target.codes, fill_value=-1)
34173430

34183431
if (not self._is_multi and self.hasnans) and target.hasnans:

0 commit comments

Comments
 (0)