Skip to content
Merged
9 changes: 6 additions & 3 deletions pandas/core/arrays/period.py
Original file line number Diff line number Diff line change
Expand Up @@ -347,7 +347,7 @@ def __repr__(self):

def __setitem__(
self,
key, # type: Union[int, Sequence[int], Sequence[bool]]
key, # type: Union[int, Sequence[int], Sequence[bool], slice]
value # type: Union[NaTType, Period, Sequence[Period]]
):
# type: (...) -> None
Expand All @@ -357,11 +357,14 @@ def __setitem__(
# ndarray[datetime64ns]. I think ndarray[int] / ndarray[str] won't
# work, since the freq can't be inferred.
if is_list_like(value):
if len(key) != len(value) and not com.is_bool_indexer(key):
is_slice = isinstance(key, slice)
if (not is_slice
and len(key) != len(value)
and not com.is_bool_indexer(key)):
msg = ("shape mismatch: value array of length '{}' does not "
"match indexing result of length '{}'.")
raise ValueError(msg.format(len(key), len(value)))
if len(key) == 0:
if not is_slice and len(key) == 0:
return

value = period_array(value)
Expand Down
10 changes: 10 additions & 0 deletions pandas/tests/extension/base/setitem.py
Original file line number Diff line number Diff line change
Expand Up @@ -173,3 +173,13 @@ def test_setitem_tuple_index(self, data):
expected = pd.Series(data.take([1, 1]), index=s.index)
s[(0, 1)] = data[1]
self.assert_series_equal(s, expected)

def test_setitem_slice_mismatch_length_raises(self, data):
arr = data[:5]
with pytest.raises(ValueError):
arr[:1] = arr[:2]

def test_setitem_slice_array(self, data):
arr = data[:5].copy()
arr[:5] = data[-5:]
self.assert_extension_array_equal(arr, data[-5:])