diff --git a/pandas/core/internals/blocks.py b/pandas/core/internals/blocks.py index 80c8a1e8ef5c7..ef5300d3b8ea5 100644 --- a/pandas/core/internals/blocks.py +++ b/pandas/core/internals/blocks.py @@ -1665,7 +1665,9 @@ def setitem(self, indexer, value): try: values[indexer] = value - except (ValueError, TypeError): + except (ValueError, TypeError) as e: + if str(e) == "Cannot index with an integer indexer containing NA values": + raise if isinstance(self.dtype, IntervalDtype): # see TestSetitemFloatIntervalWithIntIntervalValues nb = self.coerce_to_target_dtype(orig_value, warn_on_upcast=True) diff --git a/pandas/tests/extension/base/setitem.py b/pandas/tests/extension/base/setitem.py index 3fb2fc09eaa79..afefc121c7edf 100644 --- a/pandas/tests/extension/base/setitem.py +++ b/pandas/tests/extension/base/setitem.py @@ -202,24 +202,24 @@ def test_setitem_integer_array(self, data, idx, box_in_series): arr[idx] = arr[0] tm.assert_equal(arr, expected) + @pytest.mark.filterwarnings("ignore::FutureWarning") @pytest.mark.parametrize( "idx, box_in_series", [ ([0, 1, 2, pd.NA], False), pytest.param( - [0, 1, 2, pd.NA], True, marks=pytest.mark.xfail(reason="GH-31948") + [0, 1, 2, pd.NA], + True, + marks=pytest.mark.xfail(reason="KeyError: '[0 1 2 ] not in index'"), ), (pd.array([0, 1, 2, pd.NA], dtype="Int64"), False), - # TODO: change False to True? - (pd.array([0, 1, 2, pd.NA], dtype="Int64"), False), # noqa: PT014 + (pd.array([0, 1, 2, pd.NA], dtype="Int64"), True), ], ids=["list-False", "list-True", "integer-array-False", "integer-array-True"], ) def test_setitem_integer_with_missing_raises(self, data, idx, box_in_series): arr = data.copy() - # TODO(xfail) this raises KeyError about labels not found (it tries label-based) - # for list of labels with Series if box_in_series: arr = pd.Series(data, index=[chr(100 + i) for i in range(len(data))])