pandas-dev/pandas · error · TypeError

dtype '{self.dtype}' does not support operation 'quantile'

Error message

dtype '{self.dtype}' does not support operation 'quantile'

What it means

Raised in _groupby_quantile for a StringDtype column — quantile requires ordered numeric values, and strings have no quantile semantics in this path, so pandas raises TypeError naming 'quantile' explicitly.

Source

Thrown at pandas/core/arrays/arrow/array.py:3586

            ids=ids,
            **kwargs,
        )
        return self._groupby_result_to_arrow(result)

    def _groupby_quantile(
        self,
        *,
        qs: npt.NDArray[np.float64],
        interpolation: Literal["linear", "lower", "higher", "nearest", "midpoint"],
        ids: npt.NDArray[np.intp],
        ngroups: int,
        starts: npt.NDArray[np.int64],
        ends: npt.NDArray[np.int64],
    ) -> ArrayLike:
        from pandas.core.arrays.string_ import StringDtype

        if isinstance(self.dtype, StringDtype):
            raise TypeError(
                f"dtype '{self.dtype}' does not support operation 'quantile'"
            )

        values = self._to_groupby_compatible()
        result = values._groupby_quantile(
            qs=qs,
            interpolation=interpolation,
            ids=ids,
            ngroups=ngroups,
            starts=starts,
            ends=ends,
        )
        return self._groupby_result_to_arrow(result)

    def _apply_elementwise(self, func: Callable) -> list[list[Any]]:
        """Apply a callable to each element while maintaining the chunking structure."""
        return [
            [

View on GitHub (pinned to 71959b8cb9)

Solutions

  1. Exclude string columns before quantile: `df.groupby('g')[numeric_cols].quantile(0.5)`.
  2. Cast the string column to numeric if its contents are numeric strings.
  3. Use `.value_counts()` or mode for non-numeric 'typical value' queries.

Example fix

// before
df = pd.DataFrame({"g": ["a", "a"], "x": ["1", "2"]}, dtype="string[pyarrow]")
df.groupby("g").quantile()

// after
df["x"] = df["x"].astype("float64[pyarrow]")
df.groupby("g").quantile()
Defensive patterns

Strategy: type-guard

Validate before calling

import pandas as pd

def can_quantile(series) -> bool:
    return not isinstance(getattr(series, "dtype", None), pd.StringDtype)

Type guard

def supports_quantile(series) -> bool:
    import pandas as pd
    return not isinstance(getattr(series, "dtype", None), pd.StringDtype)

Try / catch

try:
    df.groupby("g").quantile()
except TypeError as e:
    if "does not support operation 'quantile'" in str(e):
        df.groupby("g")[df.select_dtypes("number").columns].quantile()
    else:
        raise

Prevention

When it happens

Trigger: Calling `df.groupby('g').quantile(...)` on a DataFrame whose value column is `string[pyarrow]` (or StringDtype-backed-by-arrow).

Common situations: Running `.quantile()` across all groupby columns without filtering dtypes, or treating categorical/string codes as numeric.

Related errors


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