diff --git a/chainladder/core/slice.py b/chainladder/core/slice.py index 96a47799..fd071245 100644 --- a/chainladder/core/slice.py +++ b/chainladder/core/slice.py @@ -431,7 +431,9 @@ def key_to_slice(self, key: _LabelKey) -> tuple[_AxisKey, _AxisKey, _AxisKey, _A return out def __setitem__(self, key: _LabelKey, values: int | float | TriangleSlicer) -> None: - super().__setitem__(cast(tuple[_AxisKey, _AxisKey, _AxisKey, _AxisKey], self.key_to_slice(key)), values) + raw_slice = self.key_to_slice(key) + contig_slice = [_LocBase._contig_slice(x) for x in raw_slice] + super().__setitem__(cast(tuple[_AxisKey, _AxisKey, _AxisKey, _AxisKey], contig_slice), values) class Ilocation(_LocBase): """ diff --git a/chainladder/core/tests/test_slicing.py b/chainladder/core/tests/test_slicing.py index c4c2f5ef..b54ed49b 100644 --- a/chainladder/core/tests/test_slicing.py +++ b/chainladder/core/tests/test_slicing.py @@ -273,7 +273,29 @@ def test_loc_setitem_triangle_value(clrd: Triangle) -> None: tri.loc["Aegis Grp", "comauto"] = sub * 2 assert tri.loc["Aegis Grp", "comauto"] == sub * 2 +def test_loc_setitem_partial_triangles(raa: Triangle) -> None: + """ + Use Triangle.loc to set a few origin or develop period via a TriangleSlicer. + + Parameters + ---------- + raa: Triangle + The raa sample data set fixture. + Returns + ------- + None + + """ + raa2 = raa * 2 + raa_new = raa.copy() + raa_new.loc[:,:,:,:60] = raa2.loc[:,:,:,:60] + raa_new.loc[:,:,:,72:] = raa2.loc[:,:,:,72:] + assert raa_new == raa2 + raa_new = raa.copy() + raa_new.loc[:,:,:'1984',:] = raa2.loc[:,:,:'1984',:] + raa_new.loc[:,:,'1985':,:] = raa2.loc[:,:,'1985':,:] + assert raa_new == raa2 def test_invalid_iloc_sparse_assignment(prism) -> None: """