diff --git a/pandas/core/indexing.py b/pandas/core/indexing.py index f1f453cf433cf..4a8792f72a604 100644 --- a/pandas/core/indexing.py +++ b/pandas/core/indexing.py @@ -1989,7 +1989,8 @@ def _setitem_with_indexer_split_path(self, indexer, value, name: str): return self._setitem_with_indexer((pi, info_axis[0]), value[0]) raise ValueError( - "Must have equal len keys and value when setting with an iterable" + f"Length mismatch when setting Dataframe with an iterable. " + f"Keys: {pi}, Values: {value}" ) elif lplane_indexer == 0 and len(value) == len(self.obj.index): @@ -2017,7 +2018,8 @@ def _setitem_with_indexer_split_path(self, indexer, value, name: str): else: raise ValueError( - "Must have equal len keys and value when setting with an iterable" + f"Length mismatch when setting Dataframe with an iterable. " + f"Keys: {pi}, Values: {value}" ) else: diff --git a/pandas/tests/frame/indexing/test_setitem.py b/pandas/tests/frame/indexing/test_setitem.py index 20dd7b0c4d3e7..e8ca540f39696 100644 --- a/pandas/tests/frame/indexing/test_setitem.py +++ b/pandas/tests/frame/indexing/test_setitem.py @@ -1098,7 +1098,7 @@ def test_setitem_loc_empty_indexer_raises_with_non_empty_value(self, box): indexer = box([], dtype="object") else: indexer = box([]) - msg = "Must have equal len keys and value when setting with an iterable" + msg = "Length mismatch when setting Dataframe with an iterable" with pytest.raises(ValueError, match=msg): df.loc[indexer, ["b"]] = [1] diff --git a/pandas/tests/indexing/multiindex/test_setitem.py b/pandas/tests/indexing/multiindex/test_setitem.py index d732cb4d7fbbc..c5d6298ed4527 100644 --- a/pandas/tests/indexing/multiindex/test_setitem.py +++ b/pandas/tests/indexing/multiindex/test_setitem.py @@ -225,7 +225,7 @@ def test_multiindex_assignment_single_dtype(self): tm.assert_series_equal(df.loc[4, "c"], exp) # invalid assignments - msg = "Must have equal len keys and value when setting with an iterable" + msg = "Length mismatch when setting Dataframe with an iterable" with pytest.raises(ValueError, match=msg): df.loc[4, "c"] = [0, 1, 2, 3] diff --git a/pandas/tests/indexing/multiindex/test_slice.py b/pandas/tests/indexing/multiindex/test_slice.py index 7f298e9bdd375..468b31920a189 100644 --- a/pandas/tests/indexing/multiindex/test_slice.py +++ b/pandas/tests/indexing/multiindex/test_slice.py @@ -660,7 +660,7 @@ def test_per_axis_per_level_setitem(self): [[100], [100, 100]], dtype="int64" ) - msg = "Must have equal len keys and value when setting with an iterable" + msg = "Length mismatch when setting Dataframe with an iterable" with pytest.raises(ValueError, match=msg): df.loc[(slice(None), 1), (slice(None), ["foo"])] = np.array( [100, 100, 100, 100], dtype="int64" diff --git a/pandas/tests/indexing/test_indexing.py b/pandas/tests/indexing/test_indexing.py index 113eb6c2b2c31..6d1f42adf7c6b 100644 --- a/pandas/tests/indexing/test_indexing.py +++ b/pandas/tests/indexing/test_indexing.py @@ -46,7 +46,7 @@ def test_setitem_ndarray_1d(self): df["bar"] = np.zeros(10, dtype=complex) # invalid - msg = "Must have equal len keys and value when setting with an iterable" + msg = "Length mismatch when setting Dataframe with an iterable" with pytest.raises(ValueError, match=msg): df.loc[df.index[2:5], "bar"] = np.array([2.33j, 1.23 + 0.1j, 2.2, 1.0]) @@ -67,7 +67,7 @@ def test_setitem_ndarray_1d_2(self): df["foo"] = np.zeros(10, dtype=np.float64) df["bar"] = np.zeros(10, dtype=complex) - msg = "Must have equal len keys and value when setting with an iterable" + msg = "Length mismatch when setting Dataframe with an iterable" with pytest.raises(ValueError, match=msg): df[2:5] = np.arange(1, 4) * 1j @@ -1036,7 +1036,7 @@ def test_scalar_setitem_with_nested_value(value): df = DataFrame({"A": [1, 2, 3]}) msg = "|".join( [ - "Must have equal len keys and value", + "Length mismatch when setting Dataframe with an iterable", "setting an array element with a sequence", ] ) @@ -1046,7 +1046,9 @@ def test_scalar_setitem_with_nested_value(value): # TODO For object dtype this happens as well, but should we rather preserve # the nested data and set as such? df = DataFrame({"A": [1, 2, 3], "B": np.array([1, "a", "b"], dtype=object)}) - with pytest.raises(ValueError, match="Must have equal len keys and value"): + with pytest.raises( + ValueError, match="Length mismatch when setting Dataframe with an iterable" + ): df.loc[0, "B"] = value # if isinstance(value, np.ndarray): # assert (df.loc[0, "B"] == value).all()