{"record":{"id":"1ef14c6dd2a42934","repo":"pandas-dev/pandas","slug":"extensionarray-fillna-does-not-support-filling-wit","errorCode":null,"errorMessage":"ExtensionArray.fillna does not support filling with a dict. Use Series.fillna instead.","messagePattern":"ExtensionArray\\.fillna does not support filling with a dict\\. Use Series\\.fillna instead\\.","errorType":"validation","errorClass":"TypeError","httpStatus":null,"severity":"error","filePath":"pandas/core/arrays/arrow/array.py","lineNumber":1694,"sourceCode":"            NA values.\n        api.extensions.ExtensionArray.isna : A 1-D array indicating if\n            each value is missing.\n\n        Examples\n        --------\n        >>> arr = pd.array(\n        ...     [np.nan, np.nan, 2, 3, np.nan, np.nan], dtype=\"int64[pyarrow]\"\n        ... )\n        >>> arr.fillna(0)\n        <ArrowExtensionArray>\n        [0, 0, 2, 3, 0, 0]\n        Length: 6, dtype: int64[pyarrow]\n        \"\"\"\n        if not self._hasna:\n            return self.copy()\n\n        if isinstance(value, dict):\n            raise TypeError(\n                \"ExtensionArray.fillna does not support filling with a dict. \"\n                \"Use Series.fillna instead.\"\n            )\n\n        if limit is not None:\n            return super().fillna(value=value, limit=limit, copy=copy)\n\n        if isinstance(value, (np.ndarray, ExtensionArray)):\n            # Similar to check_value_size, but we do not mask here since we may\n            #  end up passing it to the super() method.\n            if len(value) != len(self):\n                raise ValueError(\n                    f\"Length of 'value' does not match. Got ({len(value)}) \"\n                    f\" expected {len(self)}\"\n                )\n\n        try:\n            fill_value = self._box_pa(value, pa_type=self._pa_array.type)","sourceCodeStart":1676,"sourceCodeEnd":1712,"githubUrl":"https://github.com/pandas-dev/pandas/blob/71959b8cb9b2459c16e14b34f28b178ccfe14735/pandas/core/arrays/arrow/array.py#L1676-L1712","documentation":"Raised by ArrowExtensionArray.fillna when `value` is a dict. ExtensionArray.fillna only supports scalar or array-like values; dict-based per-position filling is a Series-level feature (Series.fillna maps dict keys to labels). pandas raises TypeError pointing the user to Series.fillna rather than silently mishandling the dict.","triggerScenarios":"`arrow_arr.fillna({0: 1, 2: 3})`, `pd.array([...], dtype='int64[pyarrow]').fillna({'col': 0})`. Calling .fillna on the raw extension array (arr.fillna) rather than on a Series.","commonSituations":"Working at the array level (.array / pd.array(...)) and passing a dict that worked on Series.fillna; generic pipelines that always pass dicts to fillna regardless of object type.","solutions":["Use Series.fillna for dict-based fills: pd.Series(arr).fillna({0:1, 2:3}).","Pass a scalar to the array: arr.fillna(0).","Pass an array-like of fill values aligned by position: arr.fillna(np.array([...])).","Convert positional dict to a list: arr.fillna([v for _,v in sorted(d.items())])."],"exampleFix":"# before\narr = pd.array([1, None, 3], dtype='int64[pyarrow]')\narr.fillna({1: 99})  # TypeError\n# after - use Series for dict semantics\nfilled = pd.Series(arr).fillna({1: 99}).array\n# or scalar/array\nfilled = arr.fillna(99)","handlingStrategy":"type-guard","validationCode":"def fillna_arrow(arr, value):\n    import collections\n    if isinstance(value, dict):\n        # use Series for dict semantics\n        import pandas as pd\n        return pd.Series(arr).fillna(value).array\n    return arr.fillna(value)\n\nfilled = fillna_arrow(arr, {1: 99})","typeGuard":"import collections.abc\n\ndef is_fillna_dict(value) -> bool:\n    return isinstance(value, collections.abc.Mapping)","tryCatchPattern":"try:\n    out = arr.fillna(value)\nexcept TypeError as e:\n    if 'does not support filling with a dict' in str(e):\n        import pandas as pd\n        out = pd.Series(arr).fillna(value).array\n    else:\n        raise","preventionTips":["Use Series.fillna (not ExtensionArray.fillna) for dict-based fills.","Pass scalars or array-likes to ExtensionArray.fillna.","Gate dict handling at the API boundary before reaching the array."],"tags":["pyarrow","fillna","dict-value","api-misuse"],"analyzedSha":"71959b8cb9b2459c16e14b34f28b178ccfe14735","analyzedAt":"2026-08-07T01:30:20.476Z","schemaVersion":2},"datasetVersion":"2026-08-07T03:17:09.362Z"}