Skip to content

Commit 3d8f173

Browse files
committed
PERF: do not expand categoricals when re-coding
1 parent bfe8e75 commit 3d8f173

File tree

1 file changed

+11
-9
lines changed

1 file changed

+11
-9
lines changed

pandas/core/categorical.py

+11-9
Original file line numberDiff line numberDiff line change
@@ -293,13 +293,10 @@ def __init__(self, values, categories=None, ordered=None, dtype=None,
293293

294294
# sanitize input
295295
if is_categorical_dtype(values):
296-
values = values.get_values()
297-
298-
elif isinstance(values, (ABCIndexClass, ABCSeries)):
299-
# we'll do inference later
300-
pass
296+
if dtype.categories is None:
297+
dtype = CategoricalDtype(values.categories, dtype.ordered)
301298

302-
else:
299+
elif not isinstance(values, (ABCIndexClass, ABCSeries)):
303300

304301
# on numpy < 1.6 datetimelike get inferred to all i8 by
305302
# _sanitize_array which is fine, but since factorize does this
@@ -337,9 +334,14 @@ def __init__(self, values, categories=None, ordered=None, dtype=None,
337334
raise NotImplementedError("> 1 ndim Categorical are not "
338335
"supported at this time")
339336

340-
if dtype.categories is None:
341-
# we're inferring from values
342-
dtype = CategoricalDtype(categories, dtype.ordered)
337+
# we're inferring from values
338+
dtype = CategoricalDtype(categories, dtype.ordered)
339+
340+
elif is_categorical_dtype(values):
341+
old_codes = (values.cat.codes if isinstance(values, ABCSeries)
342+
else values.codes)
343+
codes = _recode_for_categories(old_codes, values.dtype.categories,
344+
dtype.categories)
343345

344346
else:
345347
codes = _get_codes_for_values(values, dtype.categories)

0 commit comments

Comments
 (0)