Skip to content

Commit 81e5144

Browse files
jbrockmendelJulianWgs
authored andcommitted
PERF: CategoricalIndex.get_indexer (pandas-dev#42270)
1 parent f6105a4 commit 81e5144

File tree

1 file changed

+15
-7
lines changed

1 file changed

+15
-7
lines changed

pandas/core/indexes/base.py

+15-7
Original file line numberDiff line numberDiff line change
@@ -3421,16 +3421,24 @@ def get_indexer(
34213421
# matched to Interval scalars
34223422
return self._get_indexer_non_comparable(target, method=method, unique=True)
34233423

3424+
if is_categorical_dtype(self.dtype):
3425+
# _maybe_cast_listlike_indexer ensures target has our dtype
3426+
# (could improve perf by doing _should_compare check earlier?)
3427+
assert is_dtype_equal(self.dtype, target.dtype)
3428+
3429+
indexer = self._engine.get_indexer(target.codes)
3430+
if self.hasnans and target.hasnans:
3431+
loc = self.get_loc(np.nan)
3432+
mask = target.isna()
3433+
indexer[mask] = loc
3434+
return indexer
3435+
34243436
if is_categorical_dtype(target.dtype):
34253437
# potential fastpath
34263438
# get an indexer for unique categories then propagate to codes via take_nd
3427-
if is_categorical_dtype(self.dtype):
3428-
# Avoid RecursionError GH#42088
3429-
categories_indexer = self._get_indexer(target.categories)
3430-
else:
3431-
# get_indexer instead of _get_indexer needed for MultiIndex cases
3432-
# e.g. test_append_different_columns_types
3433-
categories_indexer = self.get_indexer(target.categories)
3439+
# get_indexer instead of _get_indexer needed for MultiIndex cases
3440+
# e.g. test_append_different_columns_types
3441+
categories_indexer = self.get_indexer(target.categories)
34343442

34353443
indexer = algos.take_nd(categories_indexer, target.codes, fill_value=-1)
34363444

0 commit comments

Comments
 (0)