Skip to content

Commit cd9b6a0

Browse files
committed
__setitem__ raises NotImplemented when bool mask passed through iloc
1 parent c1e57c9 commit cd9b6a0

File tree

2 files changed

+25
-0
lines changed

2 files changed

+25
-0
lines changed

pandas/core/indexing.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1637,6 +1637,18 @@ def _has_valid_setitem_indexer(self, indexer) -> bool:
16371637
"Consider using .loc with a DataFrame indexer for automatic alignment.",
16381638
)
16391639

1640+
# Check for Series boolean indexer
1641+
if com.is_bool_indexer(indexer) and hasattr(indexer, "index") and isinstance(indexer.index, Index):
1642+
if indexer.index.inferred_type == "integer":
1643+
raise NotImplementedError(
1644+
"iLocation based boolean "
1645+
"indexing on an integer type "
1646+
"is not available"
1647+
)
1648+
raise ValueError(
1649+
"iLocation based boolean indexing cannot use an indexable as a mask"
1650+
)
1651+
16401652
if not isinstance(indexer, tuple):
16411653
indexer = _tuplify(self.ndim, indexer)
16421654

pandas/tests/frame/indexing/test_getitem.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -407,6 +407,19 @@ def test_getitem_frozenset_unique_in_column(self):
407407
expected = Series([1], name=frozenset(["KEY"]))
408408
tm.assert_series_equal(result, expected)
409409

410+
def test_series_boolean_indexer_iloc_consistency(self):
411+
# GH#60994 - Test consistency between __getitem__ and __setitem__ for Series boolean indexers
412+
ser = Series([0, 1, 2])
413+
mask = Series([True, False, False])
414+
415+
# __getitem__ should raise NotImplementedError
416+
with pytest.raises(NotImplementedError, match="iLocation based boolean indexing on an integer type is not available"):
417+
ser.iloc[mask]
418+
419+
# __setitem__ should also raise NotImplementedError for consistency
420+
with pytest.raises(NotImplementedError, match="iLocation based boolean indexing on an integer type is not available"):
421+
ser.iloc[mask] = 10
422+
410423

411424
class TestGetitemSlice:
412425
def test_getitem_slice_float64(self, frame_or_series):

0 commit comments

Comments
 (0)