{"record":{"id":"bc7d9a164cbfd58d","repo":"pandas-dev/pandas","slug":"pyarrow-pyarrow-min-version-is-required-for-pya-bc7d9a","errorCode":null,"errorMessage":"pyarrow>={PYARROW_MIN_VERSION} is required for PyArrow backed StringArray.","messagePattern":"pyarrow>=(.+?) is required for PyArrow backed StringArray\\.","errorType":"exception","errorClass":"ImportError","httpStatus":null,"severity":"error","filePath":"pandas/core/arrays/string_.py","lineNumber":216,"sourceCode":"        storage: str | None = None,\n        na_value: libmissing.NAType | float = libmissing.NA,\n    ) -> None:\n        # infer defaults\n        if storage is None:\n            storage = config[\"mode\"][\"string_storage\"]\n            if storage == \"auto\":\n                if HAS_PYARROW:\n                    storage = \"pyarrow\"\n                else:\n                    storage = \"python\"\n\n        # validate options\n        if storage not in {\"python\", \"pyarrow\"}:\n            raise ValueError(\n                f\"Storage must be 'python' or 'pyarrow'. Got {storage} instead.\"\n            )\n        if storage == \"pyarrow\" and not HAS_PYARROW:\n            raise ImportError(\n                f\"pyarrow>={PYARROW_MIN_VERSION} is required for PyArrow \"\n                \"backed StringArray.\"\n            )\n\n        if isinstance(na_value, float) and np.isnan(na_value):\n            # when passed a NaN value, always set to np.nan to ensure we use\n            # a consistent NaN value (and we can use `dtype.na_value is np.nan`)\n            na_value = np.nan\n        elif na_value is not libmissing.NA:\n            raise ValueError(f\"'na_value' must be np.nan or pd.NA, got {na_value}\")\n\n        self._storage = cast(\"str\", storage)\n        self._na_value = na_value\n\n    def __repr__(self) -> str:\n        storage = \"\" if self.storage == \"pyarrow\" else \"storage='python', \"\n        return f\"<StringDtype({storage}na_value={self._na_value})>\"\n","sourceCodeStart":198,"sourceCodeEnd":234,"githubUrl":"https://github.com/pandas-dev/pandas/blob/71959b8cb9b2459c16e14b34f28b178ccfe14735/pandas/core/arrays/string_.py#L198-L234","documentation":"StringDtype.__init__ raises ImportError when storage='pyarrow' is requested but pyarrow is not installed at or above PYARROW_MIN_VERSION (the HAS_PYARROW flag is False). This is an ImportError rather than ValueError because the root cause is a missing optional dependency, distinguishing it from a bad argument.","triggerScenarios":"Calling StringDtype(storage='pyarrow'), pd.array(data, dtype='string[pyarrow]'), pd.Series(data, dtype='string[pyarrow]'), or pd.read_csv(..., dtype_backend='pyarrow') in an environment where pyarrow is not installed or is too old.","commonSituations":"Fresh virtualenv without pyarrow; minimal CI images; downgrading pyarrow below the minimum; deploying to a slim container that omitted the optional dependency.","solutions":["Install or upgrade pyarrow: pip install -U pyarrow.","Fall back to python storage: StringDtype(storage='python') or dtype='string[python]'.","Pin pyarrow>=PYARROW_MIN_VERSION in your requirements file."],"exampleFix":"// before (pyarrow not installed)\nser = pd.Series(['a','b'], dtype='string[pyarrow]')\n\n// after\npip install pyarrow\nser = pd.Series(['a','b'], dtype='string[pyarrow]')","handlingStrategy":"try-catch","validationCode":"from pandas.compat import HAS_PYARROW\n\nstorage = 'pyarrow' if HAS_PYARROW else 'python'\ndtype = pd.StringDtype(storage=storage)","typeGuard":"from pandas.compat import HAS_PYARROW\n\ndef pyarrow_available() -> bool:\n    return HAS_PYARROW","tryCatchPattern":"try:\n    dtype = pd.StringDtype(storage='pyarrow')\nexcept ImportError:\n    dtype = pd.StringDtype(storage='python')","preventionTips":["Declare pyarrow in requirements.txt or pyproject for any code using string[pyarrow].","Feature-detect HAS_PYARROW before requesting pyarrow storage.","Provide a python-storage fallback in environments where pyarrow is optional."],"tags":["pyarrow","dependency","import-error","string-dtype"],"analyzedSha":"71959b8cb9b2459c16e14b34f28b178ccfe14735","analyzedAt":"2026-08-07T01:30:20.476Z","schemaVersion":2},"datasetVersion":"2026-08-07T03:17:09.362Z"}