diff --git a/pandas/core/internals/blocks.py b/pandas/core/internals/blocks.py index 27acd720b6d71..2c19765b1e6a2 100644 --- a/pandas/core/internals/blocks.py +++ b/pandas/core/internals/blocks.py @@ -1029,9 +1029,7 @@ def _putmask_simple(self, mask: np.ndarray, value: Any): # GH#37833 np.putmask is more performant than __setitem__ np.putmask(values, mask, value) - def putmask( - self, mask, new, inplace: bool = False, axis: int = 0, transpose: bool = False - ) -> List["Block"]: + def putmask(self, mask, new, axis: int = 0) -> List["Block"]: """ putmask the data to the block; it is possible that we may create a new dtype of block @@ -1042,16 +1040,13 @@ def putmask( ---------- mask : np.ndarray[bool], SparseArray[bool], or BooleanArray new : a ndarray/object - inplace : bool, default False - Perform inplace modification. axis : int - transpose : bool, default False - Set to True if self is stored with axes reversed. Returns ------- List[Block] """ + transpose = self.ndim == 2 mask = _extract_bool_array(mask) assert not isinstance(new, (ABCIndex, ABCSeries, ABCDataFrame)) @@ -1077,8 +1072,6 @@ def putmask( new = np.repeat(new, new_values.shape[-1]).reshape(self.shape) new = new.astype(new_values.dtype) - if new_values is self.values and not inplace: - new_values = new_values.copy() # we require exact matches between the len of the # values we are setting (or is compat). np.putmask # doesn't check this and will simply truncate / pad @@ -1099,6 +1092,7 @@ def putmask( # `np.place` on the other hand uses the ``new`` values at it is # to place in the masked locations of ``new_values`` np.place(new_values, mask, new) + # i.e. new_values[mask] = new elif mask.shape[-1] == len(new) or len(new) == 1: np.putmask(new_values, mask, new) else: @@ -1143,18 +1137,10 @@ def f(mask, val, idx): nv = _putmask_smart(val, mask, n) return nv - new_blocks = self.split_and_operate(mask, f, inplace) + new_blocks = self.split_and_operate(mask, f, True) return new_blocks - if inplace: - return [self] - - if transpose: - if new_values is None: - new_values = self.values if inplace else self.values.copy() - new_values = new_values.T - - return [self.make_block(new_values)] + return [self] def coerce_to_target_dtype(self, other): """ @@ -1697,17 +1683,13 @@ def set_inplace(self, locs, values): assert locs.tolist() == [0] self.values = values - def putmask( - self, mask, new, inplace: bool = False, axis: int = 0, transpose: bool = False - ) -> List["Block"]: + def putmask(self, mask, new, axis: int = 0) -> List["Block"]: """ See Block.putmask.__doc__ """ - inplace = validate_bool_kwarg(inplace, "inplace") - mask = _extract_bool_array(mask) - new_values = self.values if inplace else self.values.copy() + new_values = self.values if isinstance(new, (np.ndarray, ExtensionArray)) and len(new) == len(mask): new = new[mask] diff --git a/pandas/core/internals/managers.py b/pandas/core/internals/managers.py index e939c43015aed..3ccdd287dd502 100644 --- a/pandas/core/internals/managers.py +++ b/pandas/core/internals/managers.py @@ -565,7 +565,6 @@ def setitem(self, indexer, value) -> "BlockManager": return self.apply("setitem", indexer=indexer, value=value) def putmask(self, mask, new, align: bool = True, axis: int = 0): - transpose = self.ndim == 2 if align: align_keys = ["new", "mask"] @@ -578,9 +577,7 @@ def putmask(self, mask, new, align: bool = True, axis: int = 0): align_keys=align_keys, mask=mask, new=new, - inplace=True, axis=axis, - transpose=transpose, ) def diff(self, n: int, axis: int) -> "BlockManager":