diff --git a/pandas/core/arrays/_mixins.py b/pandas/core/arrays/_mixins.py index e9d8671b69c78..284dd31ffcb59 100644 --- a/pandas/core/arrays/_mixins.py +++ b/pandas/core/arrays/_mixins.py @@ -9,6 +9,7 @@ from pandas.core.algorithms import take, unique from pandas.core.array_algos.transforms import shift from pandas.core.arrays.base import ExtensionArray +from pandas.core.indexers import check_array_indexer _T = TypeVar("_T", bound="NDArrayBackedExtensionArray") @@ -156,3 +157,14 @@ def _validate_shift_value(self, fill_value): # TODO: after deprecation in datetimelikearraymixin is enforced, # we can remove this and ust validate_fill_value directly return self._validate_fill_value(fill_value) + + def __setitem__(self, key, value): + key = self._validate_setitem_key(key) + value = self._validate_setitem_value(value) + self._ndarray[key] = value + + def _validate_setitem_key(self, key): + return check_array_indexer(self, key) + + def _validate_setitem_value(self, value): + return value diff --git a/pandas/core/arrays/categorical.py b/pandas/core/arrays/categorical.py index 45623f182144b..0d73f45f1a395 100644 --- a/pandas/core/arrays/categorical.py +++ b/pandas/core/arrays/categorical.py @@ -1884,20 +1884,6 @@ def __getitem__(self, key): return result return self._from_backing_data(result) - def __setitem__(self, key, value): - """ - Item assignment. - - Raises - ------ - ValueError - If (one or more) Value is not in categories or if a assigned - `Categorical` does not have the same categories - """ - key = self._validate_setitem_key(key) - value = self._validate_setitem_value(value) - self._ndarray[key] = value - def _validate_setitem_value(self, value): value = extract_array(value, extract_numpy=True) diff --git a/pandas/core/arrays/datetimelike.py b/pandas/core/arrays/datetimelike.py index 377996344dbbc..5c3ef2957073a 100644 --- a/pandas/core/arrays/datetimelike.py +++ b/pandas/core/arrays/datetimelike.py @@ -609,9 +609,7 @@ def __setitem__( if no_op: return - value = self._validate_setitem_value(value) - key = check_array_indexer(self, key) - self._ndarray[key] = value + super().__setitem__(key, value) self._maybe_clear_freq() def _maybe_clear_freq(self): diff --git a/pandas/core/arrays/numpy_.py b/pandas/core/arrays/numpy_.py index d3fa87d5ea7ff..61ffa28d31ba0 100644 --- a/pandas/core/arrays/numpy_.py +++ b/pandas/core/arrays/numpy_.py @@ -259,11 +259,6 @@ def __getitem__(self, item): result = type(self)(result) return result - def __setitem__(self, key, value) -> None: - key = self._validate_setitem_key(key) - value = self._validate_setitem_value(value) - self._ndarray[key] = value - def _validate_setitem_value(self, value): value = extract_array(value, extract_numpy=True) @@ -271,9 +266,6 @@ def _validate_setitem_value(self, value): value = np.asarray(value, dtype=self._ndarray.dtype) return value - def _validate_setitem_key(self, key): - return check_array_indexer(self, key) - def isna(self) -> np.ndarray: return isna(self._ndarray)