@@ -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