From 9cbe0ff3a6e3c0ccfa73fef1342353dfdda9cff8 Mon Sep 17 00:00:00 2001 From: Joris Van den Bossche Date: Fri, 7 Feb 2020 13:00:29 +0100 Subject: [PATCH 1/2] BUG: fix StringArray/PandasArray setitem with slice --- doc/source/whatsnew/v1.0.2.rst | 4 ++++ pandas/core/arrays/numpy_.py | 4 ---- pandas/tests/extension/base/setitem.py | 10 ++++++++++ pandas/tests/extension/test_numpy.py | 4 ++++ 4 files changed, 18 insertions(+), 4 deletions(-) diff --git a/doc/source/whatsnew/v1.0.2.rst b/doc/source/whatsnew/v1.0.2.rst index 94dc1e0c007ca..767ebf419f584 100644 --- a/doc/source/whatsnew/v1.0.2.rst +++ b/doc/source/whatsnew/v1.0.2.rst @@ -28,6 +28,10 @@ Bug fixes - - +**Experimental dtypes** + +- Fixed bug in setting values using a slice indexer with string dtype (:issue:`31772`) + .. --------------------------------------------------------------------------- .. _whatsnew_102.contributors: diff --git a/pandas/core/arrays/numpy_.py b/pandas/core/arrays/numpy_.py index e573fe661106e..0e64967ce93a6 100644 --- a/pandas/core/arrays/numpy_.py +++ b/pandas/core/arrays/numpy_.py @@ -263,12 +263,8 @@ def __setitem__(self, key, value) -> None: value = extract_array(value, extract_numpy=True) key = check_array_indexer(self, key) - scalar_key = lib.is_scalar(key) scalar_value = lib.is_scalar(value) - if not scalar_key and scalar_value: - key = np.asarray(key) - if not scalar_value: value = np.asarray(value, dtype=self._ndarray.dtype) diff --git a/pandas/tests/extension/base/setitem.py b/pandas/tests/extension/base/setitem.py index e0ca603aaa0ed..980cb83beba9c 100644 --- a/pandas/tests/extension/base/setitem.py +++ b/pandas/tests/extension/base/setitem.py @@ -173,6 +173,16 @@ def test_setitem_tuple_index(self, data): s[(0, 1)] = data[1] self.assert_series_equal(s, expected) + def test_setitem_slice(self, data, box_in_series): + arr = data[:5].copy() + expected = data.take([0, 0, 0, 3, 4]) + if box_in_series: + arr = pd.Series(arr) + expected = pd.Series(expected) + + arr[:3] = data[0] + self.assert_equal(arr, expected) + def test_setitem_slice_mismatch_length_raises(self, data): arr = data[:5] with pytest.raises(ValueError): diff --git a/pandas/tests/extension/test_numpy.py b/pandas/tests/extension/test_numpy.py index 8a820c8746857..73e3def51bcf9 100644 --- a/pandas/tests/extension/test_numpy.py +++ b/pandas/tests/extension/test_numpy.py @@ -396,6 +396,10 @@ def test_setitem_scalar_key_sequence_raise(self, data): # Failed: DID NOT RAISE super().test_setitem_scalar_key_sequence_raise(data) + @skip_nested + def test_setitem_slice(self, data, box_in_series): + super().test_setitem_slice(data, box_in_series) + @skip_nested class TestParsing(BaseNumPyTests, base.BaseParsingTests): From 3ebe9e779f661a753f22502f55314b836a3dc036 Mon Sep 17 00:00:00 2001 From: Joris Van den Bossche Date: Tue, 11 Feb 2020 13:55:18 +0100 Subject: [PATCH 2/2] add test for loc/iloc --- pandas/tests/extension/base/setitem.py | 13 +++++++++++++ pandas/tests/extension/test_numpy.py | 4 ++++ 2 files changed, 17 insertions(+) diff --git a/pandas/tests/extension/base/setitem.py b/pandas/tests/extension/base/setitem.py index 980cb83beba9c..590bcd586900a 100644 --- a/pandas/tests/extension/base/setitem.py +++ b/pandas/tests/extension/base/setitem.py @@ -183,6 +183,19 @@ def test_setitem_slice(self, data, box_in_series): arr[:3] = data[0] self.assert_equal(arr, expected) + def test_setitem_loc_iloc_slice(self, data): + arr = data[:5].copy() + s = pd.Series(arr, index=["a", "b", "c", "d", "e"]) + expected = pd.Series(data.take([0, 0, 0, 3, 4]), index=s.index) + + result = s.copy() + result.iloc[:3] = data[0] + self.assert_equal(result, expected) + + result = s.copy() + result.loc[:"c"] = data[0] + self.assert_equal(result, expected) + def test_setitem_slice_mismatch_length_raises(self, data): arr = data[:5] with pytest.raises(ValueError): diff --git a/pandas/tests/extension/test_numpy.py b/pandas/tests/extension/test_numpy.py index 73e3def51bcf9..76573242a2506 100644 --- a/pandas/tests/extension/test_numpy.py +++ b/pandas/tests/extension/test_numpy.py @@ -400,6 +400,10 @@ def test_setitem_scalar_key_sequence_raise(self, data): def test_setitem_slice(self, data, box_in_series): super().test_setitem_slice(data, box_in_series) + @skip_nested + def test_setitem_loc_iloc_slice(self, data): + super().test_setitem_loc_iloc_slice(data) + @skip_nested class TestParsing(BaseNumPyTests, base.BaseParsingTests):