From 91e1380d4770e7e4693727d60f913fad81b70bf9 Mon Sep 17 00:00:00 2001 From: Brock Date: Wed, 18 Nov 2020 12:40:49 -0800 Subject: [PATCH] PERF: use np.putmask instead of ndarray.__setitem__ --- pandas/core/internals/blocks.py | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/pandas/core/internals/blocks.py b/pandas/core/internals/blocks.py index 477a06ebd3cef..1f348ca0b0ece 100644 --- a/pandas/core/internals/blocks.py +++ b/pandas/core/internals/blocks.py @@ -1028,10 +1028,15 @@ def _putmask_simple(self, mask: np.ndarray, value: Any): if lib.is_scalar(value) and isinstance(values, np.ndarray): value = convert_scalar_for_putitemlike(value, values.dtype) - if is_list_like(value) and len(value) == len(values): - values[mask] = value[mask] + if self.is_extension or self.is_object: + # GH#19266 using np.putmask gives unexpected results with listlike value + if is_list_like(value) and len(value) == len(values): + values[mask] = value[mask] + else: + values[mask] = value else: - values[mask] = value + # 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