Skip to content

Commit 88bcd2d

Browse files
authored
Fix regression for setitem not aligning rhs with boolean indexer (#39944)
1 parent 47352ea commit 88bcd2d

File tree

3 files changed

+13
-1
lines changed

3 files changed

+13
-1
lines changed

doc/source/whatsnew/v1.2.3.rst

+1-1
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ Fixed regressions
1616
~~~~~~~~~~~~~~~~~
1717

1818
- Fixed regression in :meth:`~DataFrame.to_excel` raising ``KeyError`` when giving duplicate columns with ``columns`` attribute (:issue:`39695`)
19-
-
19+
- Fixed regression in :meth:`DataFrame.__setitem__` not aligning :class:`DataFrame` on right-hand side for boolean indexer (:issue:`39931`)
2020

2121
.. ---------------------------------------------------------------------------
2222

pandas/core/frame.py

+3
Original file line numberDiff line numberDiff line change
@@ -3264,6 +3264,9 @@ def _setitem_array(self, key, value):
32643264
key = check_bool_indexer(self.index, key)
32653265
indexer = key.nonzero()[0]
32663266
self._check_setitem_copy()
3267+
if isinstance(value, DataFrame):
3268+
# GH#39931 reindex since iloc does not align
3269+
value = value.reindex(self.index.take(indexer))
32673270
self.iloc[indexer] = value
32683271
else:
32693272
if isinstance(value, DataFrame):

pandas/tests/frame/indexing/test_setitem.py

+9
Original file line numberDiff line numberDiff line change
@@ -575,3 +575,12 @@ def test_setitem_boolean_mask(self, mask_type, float_frame):
575575
expected = df.copy()
576576
expected.values[np.array(mask)] = np.nan
577577
tm.assert_frame_equal(result, expected)
578+
579+
@pytest.mark.parametrize("indexer", [tm.setitem, tm.loc])
580+
def test_setitem_boolean_mask_aligning(self, indexer):
581+
# GH#39931
582+
df = DataFrame({"a": [1, 4, 2, 3], "b": [5, 6, 7, 8]})
583+
expected = df.copy()
584+
mask = df["a"] >= 3
585+
indexer(df)[mask] = indexer(df)[mask].sort_values("a")
586+
tm.assert_frame_equal(df, expected)

0 commit comments

Comments
 (0)