Skip to content

Commit 6b43a78

Browse files
authored
REF: simplify Block.setitem (#45403)
1 parent 4ce84de commit 6b43a78

File tree

5 files changed

+14
-24
lines changed

5 files changed

+14
-24
lines changed

pandas/core/indexers/utils.py

+4-7
Original file line numberDiff line numberDiff line change
@@ -104,26 +104,23 @@ def is_scalar_indexer(indexer, ndim: int) -> bool:
104104
return False
105105

106106

107-
def is_empty_indexer(indexer, arr_value: ArrayLike) -> bool:
107+
def is_empty_indexer(indexer) -> bool:
108108
"""
109109
Check if we have an empty indexer.
110110
111111
Parameters
112112
----------
113113
indexer : object
114-
arr_value : np.ndarray or ExtensionArray
115114
116115
Returns
117116
-------
118117
bool
119118
"""
120119
if is_list_like(indexer) and not len(indexer):
121120
return True
122-
if arr_value.ndim == 1:
123-
if not isinstance(indexer, tuple):
124-
indexer = (indexer,)
125-
return any(isinstance(idx, np.ndarray) and len(idx) == 0 for idx in indexer)
126-
return False
121+
if not isinstance(indexer, tuple):
122+
indexer = (indexer,)
123+
return any(isinstance(idx, np.ndarray) and len(idx) == 0 for idx in indexer)
127124

128125

129126
# -----------------------------------------------------------

pandas/core/indexing.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -1883,7 +1883,7 @@ def _setitem_single_column(self, loc: int, value, plane_indexer):
18831883
elif (
18841884
is_array_like(value)
18851885
and is_exact_shape_match(ser, value)
1886-
and not is_empty_indexer(pi, value)
1886+
and not is_empty_indexer(pi)
18871887
):
18881888
if is_list_like(pi):
18891889
ser = value[np.argsort(pi)]
@@ -2092,7 +2092,7 @@ def ravel(i):
20922092
# we have a frame, with multiple indexers on both axes; and a
20932093
# series, so need to broadcast (see GH5206)
20942094
if sum_aligners == self.ndim and all(is_sequence(_) for _ in indexer):
2095-
if is_empty_indexer(indexer[0], ser._values):
2095+
if is_empty_indexer(indexer[0]):
20962096
return ser._values.copy()
20972097
ser = ser.reindex(obj.axes[0][indexer[0]], copy=True)._values
20982098

pandas/core/internals/array_manager.py

+2
Original file line numberDiff line numberDiff line change
@@ -1280,6 +1280,8 @@ def setitem(self, indexer, value):
12801280
See `setitem_inplace` for a version that works inplace and doesn't
12811281
return a new Manager.
12821282
"""
1283+
if isinstance(indexer, np.ndarray) and indexer.ndim > self.ndim:
1284+
raise ValueError(f"Cannot set values with ndim > {self.ndim}")
12831285
return self.apply_with_block("setitem", indexer=indexer, value=value)
12841286

12851287
def idelete(self, indexer) -> SingleArrayManager:

pandas/core/internals/blocks.py

+3-15
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,6 @@
4949
is_1d_only_ea_dtype,
5050
is_1d_only_ea_obj,
5151
is_dtype_equal,
52-
is_extension_array_dtype,
5352
is_interval_dtype,
5453
is_list_like,
5554
is_string_dtype,
@@ -911,37 +910,26 @@ def setitem(self, indexer, value):
911910
`indexer` is a direct slice/positional indexer. `value` must
912911
be a compatible shape.
913912
"""
914-
transpose = self.ndim == 2
915-
916-
if isinstance(indexer, np.ndarray) and indexer.ndim > self.ndim:
917-
raise ValueError(f"Cannot set values with ndim > {self.ndim}")
918913

919914
# coerce None values, if appropriate
920915
if value is None:
921916
if self.is_numeric:
922917
value = np.nan
923918

924919
# coerce if block dtype can store value
925-
values = cast(np.ndarray, self.values)
926920
if not self._can_hold_element(value):
927921
# current dtype cannot store value, coerce to common dtype
928922
return self.coerce_to_target_dtype(value).setitem(indexer, value)
929923

930924
# value must be storable at this moment
931-
if is_extension_array_dtype(getattr(value, "dtype", None)):
932-
# We need to be careful not to allow through strings that
933-
# can be parsed to EADtypes
934-
arr_value = value
935-
else:
936-
arr_value = np.asarray(value)
937-
938-
if transpose:
925+
values = cast(np.ndarray, self.values)
926+
if self.ndim == 2:
939927
values = values.T
940928

941929
# length checking
942930
check_setitem_lengths(indexer, value, values)
943931

944-
if is_empty_indexer(indexer, arr_value):
932+
if is_empty_indexer(indexer):
945933
# GH#8669 empty indexers, test_loc_setitem_boolean_mask_allfalse
946934
pass
947935

pandas/core/internals/managers.py

+3
Original file line numberDiff line numberDiff line change
@@ -334,6 +334,9 @@ def setitem(self: T, indexer, value) -> T:
334334
335335
For SingleBlockManager, this backs s[indexer] = value
336336
"""
337+
if isinstance(indexer, np.ndarray) and indexer.ndim > self.ndim:
338+
raise ValueError(f"Cannot set values with ndim > {self.ndim}")
339+
337340
return self.apply("setitem", indexer=indexer, value=value)
338341

339342
def putmask(self, mask, new, align: bool = True):

0 commit comments

Comments
 (0)