diff --git a/pandas/core/indexing.py b/pandas/core/indexing.py index 08bd3cde60806..675e5145c5856 100644 --- a/pandas/core/indexing.py +++ b/pandas/core/indexing.py @@ -2353,7 +2353,6 @@ def ravel(i): return i.ravel() if isinstance(i, np.ndarray) else i indexer = tuple(map(ravel, indexer)) - aligners = [not com.is_null_slice(idx) for idx in indexer] sum_aligners = sum(aligners) single_aligner = sum_aligners == 1 @@ -2371,7 +2370,9 @@ def ravel(i): # we have a frame, with multiple indexers on both axes; and a # series, so need to broadcast (see GH5206) - if sum_aligners == self.ndim and all(is_sequence(_) for _ in indexer): + if len(indexer) == self.ndim and all( + is_sequence(_) or isinstance(_, slice) for _ in indexer + ): ser_values = ser.reindex(obj.axes[0][indexer[0]])._values # single indexer @@ -2399,7 +2400,6 @@ def ravel(i): if using_cow: return ser return ser._values.copy() - return ser.reindex(new_ix)._values # 2 dims diff --git a/pandas/tests/indexing/test_loc.py b/pandas/tests/indexing/test_loc.py index 36b08ee1df790..643a5e126bb34 100644 --- a/pandas/tests/indexing/test_loc.py +++ b/pandas/tests/indexing/test_loc.py @@ -3297,3 +3297,36 @@ def test_loc_reindexing_of_empty_index(self): df.loc[Series([False] * 4, index=df.index, name=0), 0] = df[0] expected = DataFrame(index=[1, 1, 2, 2], data=["1", "1", "2", "2"]) tm.assert_frame_equal(df, expected) + + def test_loc_set_series_to_multiple_columns(self): + # GH 59933 + df = DataFrame([[1, 2, 3], [4, 5, 6]], columns=list("ABC")) + df.loc[0:3, ["A", "B", "C"]] = Series([10, 20, 30]) + expected = DataFrame([[10, 10, 10], [20, 20, 20]], columns=list("ABC")) + tm.assert_frame_equal(df, expected) + + df = DataFrame([[1, 2, 3], [4, 5, 6]], columns=list("ABC")) + df.loc[:, ["A", "B", "C"]] = Series([10, 20, 30]) + expected = DataFrame([[10, 10, 10], [20, 20, 20]], columns=list("ABC")) + tm.assert_frame_equal(df, expected) + + df = DataFrame([[1, 2, 3], [4, 5, 6], [7, 8, 9]], columns=list("ABC")) + df.loc[df["A"] > 0, ["A", "B", "C"]] = Series([10, 20, 30]) + expected = DataFrame( + [[10, 10, 10], [20, 20, 20], [30, 30, 30]], columns=list("ABC") + ) + tm.assert_frame_equal(df, expected) + + df = DataFrame([[1, 2, 3], [4, 5, 6], [7, 8, 9]], columns=list("ABC")) + df.loc[:, ["A", "B", "C"]] = Series([10, 20, 30]) + expected = DataFrame( + [[10, 10, 10], [20, 20, 20], [30, 30, 30]], columns=list("ABC") + ) + tm.assert_frame_equal(df, expected) + + df = DataFrame([[1, 2, 3], [4, 5, 6], [7, 8, 9]], columns=list("ABC")) + df.loc[0:4, ["A", "B", "C"]] = Series([10, 20, 30]) + expected = DataFrame( + [[10, 10, 10], [20, 20, 20], [30, 30, 30]], columns=list("ABC") + ) + tm.assert_frame_equal(df, expected)