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

    @classmethod

View on GitHub (pinned to 71959b8cb9)

Solutions

  1. Use the factory: ArrowExtensionArray._from_sequence([1,2,3], dtype=ArrowDtype(pa.int64())).
  2. Wrap raw data in pyarrow first: ArrowExtensionArray(pa.array([1,2,3], type=pa.int64())).
  3. For public APIs prefer pd.array([...], dtype='int64[pyarrow]') or pd.Series.
  4. 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

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


AI-assisted analysis of pandas-dev/pandas@71959b8cb9 (2026-08-07). Data as JSON: /api/errors/d7e5227ab8c94dd5. Report an issue: GitHub.