@@ -3421,16 +3421,24 @@ def get_indexer(
3421
3421
# matched to Interval scalars
3422
3422
return self ._get_indexer_non_comparable (target , method = method , unique = True )
3423
3423
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
+
3424
3436
if is_categorical_dtype (target .dtype ):
3425
3437
# potential fastpath
3426
3438
# 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 )
3434
3442
3435
3443
indexer = algos .take_nd (categories_indexer , target .codes , fill_value = - 1 )
3436
3444
0 commit comments