Closed
Description
With the last release, we have this behaviour (when setting with enlargement, we cast the categorical dtype to object):
In [1]: pd.__version__
Out[1]: '1.4.3'
In [2]: s = pd.Series(["a", "b", "c"], dtype="category")
In [3]: s.loc[3] = 0
In [4]: s
Out[4]:
0 a
1 b
2 c
3 0
dtype: object
However on the main branch I see:
In [1]: s = pd.Series(["a", "b", "c"], dtype="category")
In [2]: s.loc[3] = 0
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
File ~/scipy/pandas/pandas/core/dtypes/cast.py:558, in maybe_promote(dtype, fill_value)
555 try:
556 # error: Argument 3 to "__call__" of "_lru_cache_wrapper" has incompatible type
557 # "Type[Any]"; expected "Hashable" [arg-type]
--> 558 return _maybe_promote_cached(
559 dtype, fill_value, type(fill_value) # type: ignore[arg-type]
560 )
561 except TypeError:
562 # if fill_value is not hashable (required for caching)
File ~/scipy/pandas/pandas/core/dtypes/cast.py:571, in _maybe_promote_cached(dtype, fill_value, fill_value_type)
566 @functools.lru_cache(maxsize=128)
567 def _maybe_promote_cached(dtype, fill_value, fill_value_type):
568 # The cached version of _maybe_promote below
569 # This also use fill_value_type as (unused) argument to use this in the
570 # cache lookup -> to differentiate 1 and True
--> 571 return _maybe_promote(dtype, fill_value)
File ~/scipy/pandas/pandas/core/dtypes/cast.py:704, in _maybe_promote(dtype, fill_value)
702 dtype = np.dtype(np.object_)
--> 704 fill_value = _ensure_dtype_type(fill_value, dtype)
705 return dtype, fill_value
File ~/scipy/pandas/pandas/core/dtypes/cast.py:730, in _ensure_dtype_type(value, dtype)
729 # Note: before we get here we have already excluded isna(value)
--> 730 return dtype.type(value)
TypeError: type.__new__() takes exactly 3 arguments (1 given)
During handling of the above exception, another exception occurred:
TypeError Traceback (most recent call last)
Input In [2], in <cell line: 1>()
----> 1 s.loc[3] = 0
File ~/scipy/pandas/pandas/core/indexing.py:816, in _LocationIndexer.__setitem__(self, key, value)
813 self._has_valid_setitem_indexer(key)
815 iloc = self if self.name == "iloc" else self.obj.iloc
--> 816 iloc._setitem_with_indexer(indexer, value, self.name)
File ~/scipy/pandas/pandas/core/indexing.py:1780, in _iLocIndexer._setitem_with_indexer(self, indexer, value, name)
1777 indexer, missing = convert_missing_indexer(indexer)
1779 if missing:
-> 1780 self._setitem_with_indexer_missing(indexer, value)
1781 return
1783 if name == "loc":
1784 # must come after setting of missing
File ~/scipy/pandas/pandas/core/indexing.py:2115, in _iLocIndexer._setitem_with_indexer_missing(self, indexer, value)
2113 curr_dtype = self.obj.dtype
2114 curr_dtype = getattr(curr_dtype, "numpy_dtype", curr_dtype)
-> 2115 new_dtype = maybe_promote(curr_dtype, value)[0]
2116 else:
2117 new_dtype = None
File ~/scipy/pandas/pandas/core/dtypes/cast.py:563, in maybe_promote(dtype, fill_value)
558 return _maybe_promote_cached(
559 dtype, fill_value, type(fill_value) # type: ignore[arg-type]
560 )
561 except TypeError:
562 # if fill_value is not hashable (required for caching)
--> 563 return _maybe_promote(dtype, fill_value)
File ~/scipy/pandas/pandas/core/dtypes/cast.py:704, in _maybe_promote(dtype, fill_value)
701 if issubclass(dtype.type, (bytes, str)):
702 dtype = np.dtype(np.object_)
--> 704 fill_value = _ensure_dtype_type(fill_value, dtype)
705 return dtype, fill_value
File ~/scipy/pandas/pandas/core/dtypes/cast.py:730, in _ensure_dtype_type(value, dtype)
727 return value
729 # Note: before we get here we have already excluded isna(value)
--> 730 return dtype.type(value)
TypeError: type.__new__() takes exactly 3 arguments (1 given)