diff --git a/pandas/core/indexers/utils.py b/pandas/core/indexers/utils.py index 41920727c50fd..8c38341e02e34 100644 --- a/pandas/core/indexers/utils.py +++ b/pandas/core/indexers/utils.py @@ -104,14 +104,13 @@ def is_scalar_indexer(indexer, ndim: int) -> bool: return False -def is_empty_indexer(indexer, arr_value: ArrayLike) -> bool: +def is_empty_indexer(indexer) -> bool: """ Check if we have an empty indexer. Parameters ---------- indexer : object - arr_value : np.ndarray or ExtensionArray Returns ------- @@ -119,11 +118,9 @@ def is_empty_indexer(indexer, arr_value: ArrayLike) -> bool: """ if is_list_like(indexer) and not len(indexer): return True - if arr_value.ndim == 1: - if not isinstance(indexer, tuple): - indexer = (indexer,) - return any(isinstance(idx, np.ndarray) and len(idx) == 0 for idx in indexer) - return False + if not isinstance(indexer, tuple): + indexer = (indexer,) + return any(isinstance(idx, np.ndarray) and len(idx) == 0 for idx in indexer) # ----------------------------------------------------------- diff --git a/pandas/core/indexing.py b/pandas/core/indexing.py index 44d32e0cef66f..5f9bc142c5836 100644 --- a/pandas/core/indexing.py +++ b/pandas/core/indexing.py @@ -1883,7 +1883,7 @@ def _setitem_single_column(self, loc: int, value, plane_indexer): elif ( is_array_like(value) and is_exact_shape_match(ser, value) - and not is_empty_indexer(pi, value) + and not is_empty_indexer(pi) ): if is_list_like(pi): ser = value[np.argsort(pi)] @@ -2092,7 +2092,7 @@ def ravel(i): # we have a frame, with multiple indexers on both axes; and a # series, so need to broadcast (see GH5206) if sum_aligners == self.ndim and all(is_sequence(_) for _ in indexer): - if is_empty_indexer(indexer[0], ser._values): + if is_empty_indexer(indexer[0]): return ser._values.copy() ser = ser.reindex(obj.axes[0][indexer[0]], copy=True)._values diff --git a/pandas/core/internals/array_manager.py b/pandas/core/internals/array_manager.py index 4d36fa5f77b15..a837c35b89f1a 100644 --- a/pandas/core/internals/array_manager.py +++ b/pandas/core/internals/array_manager.py @@ -1280,6 +1280,8 @@ def setitem(self, indexer, value): See `setitem_inplace` for a version that works inplace and doesn't return a new Manager. """ + if isinstance(indexer, np.ndarray) and indexer.ndim > self.ndim: + raise ValueError(f"Cannot set values with ndim > {self.ndim}") return self.apply_with_block("setitem", indexer=indexer, value=value) def idelete(self, indexer) -> SingleArrayManager: diff --git a/pandas/core/internals/blocks.py b/pandas/core/internals/blocks.py index ef1cd92a60540..de4abdd1ba024 100644 --- a/pandas/core/internals/blocks.py +++ b/pandas/core/internals/blocks.py @@ -49,7 +49,6 @@ is_1d_only_ea_dtype, is_1d_only_ea_obj, is_dtype_equal, - is_extension_array_dtype, is_interval_dtype, is_list_like, is_string_dtype, @@ -911,10 +910,6 @@ def setitem(self, indexer, value): `indexer` is a direct slice/positional indexer. `value` must be a compatible shape. """ - transpose = self.ndim == 2 - - if isinstance(indexer, np.ndarray) and indexer.ndim > self.ndim: - raise ValueError(f"Cannot set values with ndim > {self.ndim}") # coerce None values, if appropriate if value is None: @@ -922,26 +917,19 @@ def setitem(self, indexer, value): value = np.nan # coerce if block dtype can store value - values = cast(np.ndarray, self.values) if not self._can_hold_element(value): # current dtype cannot store value, coerce to common dtype return self.coerce_to_target_dtype(value).setitem(indexer, value) # value must be storable at this moment - if is_extension_array_dtype(getattr(value, "dtype", None)): - # We need to be careful not to allow through strings that - # can be parsed to EADtypes - arr_value = value - else: - arr_value = np.asarray(value) - - if transpose: + values = cast(np.ndarray, self.values) + if self.ndim == 2: values = values.T # length checking check_setitem_lengths(indexer, value, values) - if is_empty_indexer(indexer, arr_value): + if is_empty_indexer(indexer): # GH#8669 empty indexers, test_loc_setitem_boolean_mask_allfalse pass diff --git a/pandas/core/internals/managers.py b/pandas/core/internals/managers.py index ff185a8f1949d..8599a1281a976 100644 --- a/pandas/core/internals/managers.py +++ b/pandas/core/internals/managers.py @@ -334,6 +334,9 @@ def setitem(self: T, indexer, value) -> T: For SingleBlockManager, this backs s[indexer] = value """ + if isinstance(indexer, np.ndarray) and indexer.ndim > self.ndim: + raise ValueError(f"Cannot set values with ndim > {self.ndim}") + return self.apply("setitem", indexer=indexer, value=value) def putmask(self, mask, new, align: bool = True):