BUG: Categorical.take with fill_value · Issue #23296 · pandas-dev/pandas (original) (raw)

We need to translate the user-provided fill_value to the code for that category before taking.

In [1]: import pandas as pd

In [2]: c = pd.Categorical(['a', 'b', 'c'])

In [3]: c.take([0, 1, -1], fill_value='a', allow_fill=True)

ValueError Traceback (most recent call last) in ----> 1 c.take([0, 1, -1], fill_value='a', allow_fill=True)

~/sandbox/pandas/pandas/core/arrays/categorical.py in take_nd(self, indexer, allow_fill, fill_value) 1806 codes = take(self._codes, indexer, allow_fill=allow_fill, 1807 fill_value=fill_value) -> 1808 result = self._constructor(codes, dtype=self.dtype, fastpath=True) 1809 return result 1810

~/sandbox/pandas/pandas/core/arrays/categorical.py in init(self, values, categories, ordered, dtype, fastpath) 371 372 if fastpath: --> 373 self._codes = coerce_indexer_dtype(values, categories) 374 self._dtype = self._dtype.update_dtype(dtype) 375 return

~/sandbox/pandas/pandas/core/dtypes/cast.py in coerce_indexer_dtype(indexer, categories) 603 length = len(categories) 604 if length < _int8_max: --> 605 return ensure_int8(indexer) 606 elif length < _int16_max: 607 return ensure_int16(indexer)

~/sandbox/pandas/pandas/_libs/algos_common_helper.pxi in pandas._libs.algos.ensure_int8() 413 return arr 414 else: --> 415 return arr.astype(np.int8, copy=copy) 416 else: 417 return np.array(arr, dtype=np.int8)

ValueError: invalid literal for int() with base 10: 'a'