pola-rs/polars · error · TypeError

merge_sorted is not supported for {qualified_type_name(elems

Error message

merge_sorted is not supported for {qualified_type_name(elems[0])!r}

What it means

Raised by pl.merge_sorted when the elements are not all DataFrame or all LazyFrame. The function merges pre-sorted frames on a key; Series and Expr have no merge_sorted representation at this level, so any other element type raises TypeError naming elems[0].

Source

Thrown at py-polars/src/polars/functions/eager.py:771

    row order when the key is equal between dataframes.

    The key(s) must be sorted in ascending order.
    """
    elems: Sequence[PolarsType] = list(items)

    if not elems:
        msg = "cannot merge_sort empty list"
        raise ValueError(msg)
    if len(elems) == 1 and isinstance(elems[0], (pl.DataFrame, pl.LazyFrame)):
        return elems[0]

    if not is_non_empty_sequence_of(
        elems, pl.DataFrame
    ) and not is_non_empty_sequence_of(  # type: ignore[redundant-expr]
        elems, pl.LazyFrame
    ):
        msg = f"merge_sorted is not supported for {qualified_type_name(elems[0])!r}"
        raise TypeError(msg)

    frames = [df.lazy() for df in elems]

    def reduce_fn(x: pl.LazyFrame, y: pl.LazyFrame) -> pl.LazyFrame:
        return x.merge_sorted(y, key=key, maintain_order=maintain_order)

    lf = reduce_balanced(reduce_fn, frames)
    eager = isinstance(elems[0], pl.DataFrame)
    return lf._collect_eager() if eager else lf  # type: ignore[return-value]


def _alignment_join(
    *idx_frames: tuple[int, LazyFrame],
    align_on: list[str],
    how: JoinStrategy = "full",
    descending: bool | Sequence[bool] = False,
    eager: bool = False,
) -> LazyFrame:

View on GitHub (pinned to df599052da)

Solutions

  1. For Series: concat then sort — pl.concat([s1, s2]).sort()
  2. Or promote Series to named frames: pl.merge_sorted([s1.to_frame(), s2.to_frame()], key='ts')
  3. Ensure every frame is actually sorted ascending on the key before merging

Example fix

# before
pl.merge_sorted([s1, s2], key='ts')  # TypeError

# after
pl.concat([s1, s2]).sort()
# or
pl.merge_sorted([s1.to_frame(), s2.to_frame()], key='ts')
Defensive patterns

Strategy: type-guard

Type guard

def merge_sortable(items) -> bool:
    items = list(items)
    return bool(items) and all(
        isinstance(e, (pl.DataFrame, pl.LazyFrame)) for e in items
    )

Prevention

When it happens

Trigger: pl.merge_sorted([s1, s2], key='ts'); a list mixing Series with DataFrames; passing column expressions instead of frames.

Common situations: Sorted-merge pipelines fed per-column Series by mistake; helpers that sometimes return frames and sometimes Series.

Related errors


AI-assisted analysis of pola-rs/polars@df599052da (2026-08-16). Data as JSON: /api/errors/ab9a844063108596. Report an issue: GitHub.