{"record":{"id":"436ccf8bb5a548f3","repo":"pandas-dev/pandas","slug":"cannot-set-float-nan-to-integer-backed-intervalarr","errorCode":null,"errorMessage":"Cannot set float NaN to integer-backed IntervalArray","messagePattern":"Cannot set float NaN to integer-backed IntervalArray","errorType":"validation","errorClass":"TypeError","httpStatus":null,"severity":"error","filePath":"pandas/core/arrays/interval.py","lineNumber":1199,"sourceCode":"            left = right = self.left._na_value\n        else:\n            raise TypeError(\n                \"can only insert Interval objects and NA into an IntervalArray\"\n            )\n        return left, right\n\n    def _validate_setitem_value(self, value):\n        if is_list_like(value):\n            return self._validate_listlike(value)\n\n        left, right = self._validate_scalar(value)\n\n        if is_valid_na_for_dtype(value, self.left.dtype):\n            if is_integer_dtype(self.dtype.subtype):\n                # can't set NaN on a numpy integer array\n                # GH#45484 TypeError, not ValueError, matches what we get with\n                #  non-NA un-holdable value.\n                raise TypeError(\"Cannot set float NaN to integer-backed IntervalArray\")\n\n        return left, right\n\n    # ---------------------------------------------------------------------\n    # Rendering Methods\n\n    def _formatter(self, boxed: bool = False) -> Callable[[object], str]:\n        # returning 'str' here causes us to render as e.g. \"(0, 1]\" instead of\n        #  \"Interval(0, 1, closed='right')\"\n        return str\n\n    # ---------------------------------------------------------------------\n    # Vectorized Interval Properties/Attributes\n\n    @property\n    def left(self) -> Index:\n        \"\"\"\n        Return the left endpoints of each Interval in the IntervalArray as an Index.","sourceCodeStart":1181,"sourceCodeEnd":1217,"githubUrl":"https://github.com/pandas-dev/pandas/blob/3b7651241d4da534b3559b60ef128e1c34f54116/pandas/core/arrays/interval.py#L1181-L1217","documentation":"Raised in IntervalArray._validate_setitem_value when the value is a valid NA per is_valid_na_for_dtype AND the array's subtype is integer. NumPy integer arrays cannot hold NaN; pandas raises TypeError (GH#45484) instead of silently coercing, mirroring the behavior for any non-NA un-holdable value.","triggerScenarios":"int_backed_arr[0] = np.nan; int_backed_arr.fillna(np.nan); assigning float NaN to integer-backed interval arrays.","commonSituations":"Code that uses np.nan uniformly across dtypes; converting nullable data to integer-backed intervals; pipelines that assume NaN is always acceptable as missing.","solutions":["Use pd.NA instead of np.nan (handled via the mask).","Cast the array to a float subtype if NaN semantics are required.","Use a nullable integer backing (IntervalArray over Int64 etc.)."],"exampleFix":"// before\nint_arr[0] = np.nan\n// after\nint_arr[0] = pd.NA","handlingStrategy":"type-guard","validationCode":"import numpy as np, pandas as pd\nfrom pandas.api.types import is_integer_dtype\n\ndef safe_missing(arr):\n    return pd.NA if is_integer_dtype(arr.dtype.subtype) else np.nan","typeGuard":"import numpy as np, pandas as pd\nfrom pandas.api.types import is_integer_dtype\n\ndef normalize_na(v, arr):\n    if v is np.nan and is_integer_dtype(arr.dtype.subtype):\n        return pd.NA\n    return v","tryCatchPattern":null,"preventionTips":["Prefer pd.NA for missing markers in extension arrays.","Avoid np.nan for integer-backed data of any kind.","Cast to a float subtype if NaN semantics are mandatory."],"tags":["interval-array","nan","integer","setitem"],"backgroundTag":null,"analyzedSha":"3b7651241d4da534b3559b60ef128e1c34f54116","analyzedAt":"2026-08-11T22:10:44.015Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}