Skip to content

Commit 5292533

Browse files
authored
Fix regression in iloc with boolean list (#37432)
1 parent 9c5500e commit 5292533

File tree

3 files changed

+18
-8
lines changed

3 files changed

+18
-8
lines changed

doc/source/whatsnew/v1.1.4.rst

+1
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ Fixed regressions
2727
- Fixed regression where slicing :class:`DatetimeIndex` raised :exc:`AssertionError` on irregular time series with ``pd.NaT`` or on unsorted indices (:issue:`36953` and :issue:`35509`)
2828
- Fixed regression in certain offsets (:meth:`pd.offsets.Day() <pandas.tseries.offsets.Day>` and below) no longer being hashable (:issue:`37267`)
2929
- Fixed regression in :class:`StataReader` which required ``chunksize`` to be manually set when using an iterator to read a dataset (:issue:`37280`)
30+
- Fixed regression in setitem with :meth:`DataFrame.iloc` which raised error when trying to set a value while filtering with a boolean list (:issue:`36741`)
3031
- Fixed regression in :attr:`MultiIndex.is_monotonic_increasing` returning wrong results with ``NaN`` in at least one of the levels (:issue:`37220`)
3132

3233
.. ---------------------------------------------------------------------------

pandas/core/indexing.py

+8-8
Original file line numberDiff line numberDiff line change
@@ -1670,8 +1670,6 @@ def _setitem_with_indexer(self, indexer, value):
16701670
"length than the value"
16711671
)
16721672

1673-
pi = plane_indexer[0] if lplane_indexer == 1 else plane_indexer
1674-
16751673
# we need an iterable, with a ndim of at least 1
16761674
# eg. don't pass through np.array(0)
16771675
if is_list_like_indexer(value) and getattr(value, "ndim", 1) > 0:
@@ -1698,7 +1696,7 @@ def _setitem_with_indexer(self, indexer, value):
16981696
else:
16991697
v = np.nan
17001698

1701-
self._setitem_single_column(loc, v, pi)
1699+
self._setitem_single_column(loc, v, plane_indexer)
17021700

17031701
elif not unique_cols:
17041702
raise ValueError(
@@ -1716,7 +1714,7 @@ def _setitem_with_indexer(self, indexer, value):
17161714
else:
17171715
v = np.nan
17181716

1719-
self._setitem_single_column(loc, v, pi)
1717+
self._setitem_single_column(loc, v, plane_indexer)
17201718

17211719
# we have an equal len ndarray/convertible to our labels
17221720
# hasattr first, to avoid coercing to ndarray without reason.
@@ -1735,7 +1733,9 @@ def _setitem_with_indexer(self, indexer, value):
17351733

17361734
for i, loc in enumerate(ilocs):
17371735
# setting with a list, re-coerces
1738-
self._setitem_single_column(loc, value[:, i].tolist(), pi)
1736+
self._setitem_single_column(
1737+
loc, value[:, i].tolist(), plane_indexer
1738+
)
17391739

17401740
elif (
17411741
len(labels) == 1
@@ -1744,7 +1744,7 @@ def _setitem_with_indexer(self, indexer, value):
17441744
):
17451745
# we have an equal len list/ndarray
17461746
# We only get here with len(labels) == len(ilocs) == 1
1747-
self._setitem_single_column(ilocs[0], value, pi)
1747+
self._setitem_single_column(ilocs[0], value, plane_indexer)
17481748

17491749
elif lplane_indexer == 0 and len(value) == len(self.obj.index):
17501750
# We get here in one case via .loc with a all-False mask
@@ -1759,12 +1759,12 @@ def _setitem_with_indexer(self, indexer, value):
17591759
)
17601760

17611761
for loc, v in zip(ilocs, value):
1762-
self._setitem_single_column(loc, v, pi)
1762+
self._setitem_single_column(loc, v, plane_indexer)
17631763
else:
17641764

17651765
# scalar value
17661766
for loc in ilocs:
1767-
self._setitem_single_column(loc, value, pi)
1767+
self._setitem_single_column(loc, value, plane_indexer)
17681768

17691769
else:
17701770
self._setitem_single_block(indexer, value)

pandas/tests/frame/indexing/test_setitem.py

+9
Original file line numberDiff line numberDiff line change
@@ -229,3 +229,12 @@ def test_setitem_periodindex(self):
229229
rs = df.reset_index().set_index("index")
230230
assert isinstance(rs.index, PeriodIndex)
231231
tm.assert_index_equal(rs.index, rng)
232+
233+
@pytest.mark.parametrize("klass", [list, np.array])
234+
def test_iloc_setitem_bool_indexer(self, klass):
235+
# GH: 36741
236+
df = DataFrame({"flag": ["x", "y", "z"], "value": [1, 3, 4]})
237+
indexer = klass([True, False, False])
238+
df.iloc[indexer, 1] = df.iloc[indexer, 1] * 2
239+
expected = DataFrame({"flag": ["x", "y", "z"], "value": [2, 3, 4]})
240+
tm.assert_frame_equal(df, expected)

0 commit comments

Comments
 (0)