pandas-dev/pandas · error · ValueError
Unsupported type '{type(values)}' for ArrowExtensionArray
Error message
Unsupported type '{type(values)}' for ArrowExtensionArray What it means
Raised by ArrowExtensionArray.__init__ when the `values` argument is neither a pa.Array nor a pa.ChunkedArray. The constructor only accepts already-built pyarrow arrays; any other Python object (list, numpy array, pandas array, scalar) is rejected. This is a low-level constructor guard — public construction paths go through _from_sequence which builds the pa.Array first.
Source
Thrown at pandas/core/arrays/arrow/array.py:395
_pa_array: pa.ChunkedArray
_dtype: ArrowDtype
# results from calls to methods decorated with cache_readonly get added here
_cache: dict[str, pa.ChunkedArray]
def __init__(self, values: pa.Array | pa.ChunkedArray) -> None:
if not HAS_PYARROW:
msg = (
f"pyarrow>={PYARROW_MIN_VERSION} is required for PyArrow "
"backed ArrowExtensionArray."
)
raise ImportError(msg)
if isinstance(values, pa.Array):
self._pa_array = pa.chunked_array([values])
elif isinstance(values, pa.ChunkedArray):
self._pa_array = values
else:
raise ValueError(
f"Unsupported type '{type(values)}' for ArrowExtensionArray"
)
self._dtype = ArrowDtype(self._pa_array.type)
self._cache = {}
@classmethod
def _from_sequence(
cls, scalars, *, dtype: Dtype | None = None, copy: bool = False
) -> Self:
"""
Construct a new ExtensionArray from a sequence of scalars.
"""
pa_type = to_pyarrow_type(dtype)
pa_array = cls._box_pa_array(scalars, pa_type=pa_type, copy=copy)
arr = cls(pa_array)
return arr
@classmethodView on GitHub (pinned to 71959b8cb9)
Solutions
- Use the factory: ArrowExtensionArray._from_sequence([1,2,3], dtype=ArrowDtype(pa.int64())).
- Wrap raw data in pyarrow first: ArrowExtensionArray(pa.array([1,2,3], type=pa.int64())).
- For public APIs prefer pd.array([...], dtype='int64[pyarrow]') or pd.Series.
- If you have a pa.Table column, pull a ChunkedArray via table.column(0) before constructing.
Example fix
# before from pandas.core.arrays.arrow import ArrowExtensionArray arr = ArrowExtensionArray([1, 2, 3]) # ValueError # after import pyarrow as pa arr = ArrowExtensionArray(pa.array([1, 2, 3], type=pa.int64()))
Defensive patterns
Strategy: type-guard
Validate before calling
import pyarrow as pa
def to_arrow_ext_array(values):
if isinstance(values, (pa.Array, pa.ChunkedArray)):
from pandas.core.arrays.arrow import ArrowExtensionArray
return ArrowExtensionArray(values)
# build via public factory
import pandas as pd
return pd.array(values, dtype=pd.ArrowDtype(pa.int64())) Type guard
import pyarrow as pa
def is_pyarrow_array(x) -> bool:
return isinstance(x, (pa.Array, pa.ChunkedArray)) Try / catch
try:
arr = ArrowExtensionArray(values)
except ValueError as e:
if 'Unsupported type' in str(e):
import pyarrow as pa
arr = ArrowExtensionArray(pa.array(values))
else:
raise Prevention
- Avoid calling ArrowExtensionArray() directly; use _from_sequence or pd.array.
- Always wrap raw Python lists in pa.array(...) first.
- Type-check inputs at API boundaries before construction.
When it happens
Trigger: Directly instantiating ArrowExtensionArray with raw Python/numpy data: `ArrowExtensionArray([1,2,3])`, `ArrowExtensionArray(np.array([1,2]))`, `ArrowExtensionArray(pa.chunked_array(...))` works but `ArrowExtensionArray('not an array')` fails.
Common situations: Subclassing or directly calling the constructor instead of using _from_sequence / pd.array / pd.Series(..., dtype=ArrowDtype(...)). Passing a pa.Table, pa.RecordBatch, or a Python list by mistake.
Related errors
- 'values' must be a NumPy array, not {type(values).__name__}
- Invalid side: {side}. Side must be one of 'left', 'right', '
- invalid normalization form
- replace is not supported with a re.Pattern, callable repl, c
- contains not implemented with {flags=}
AI-assisted analysis of pandas-dev/pandas@71959b8cb9 (2026-08-07).
Data as JSON: /api/errors/d7e5227ab8c94dd5.
Report an issue: GitHub.