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
- For Series: concat then sort — pl.concat([s1, s2]).sort()
- Or promote Series to named frames: pl.merge_sorted([s1.to_frame(), s2.to_frame()], key='ts')
- 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
- Route Series through concat + sort instead of merge_sorted
- Keep sorted-merge pipelines frame-based from ingestion onward
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
- cannot treat Series of type {s.dtype} as indices
- {how!r} strategy is not supported for {qualified_type_name(e
- Series only supports 'vertical' concat strategy
- did not expect type: {qualified_type_name(elems[0])!r} in `c
- cannot merge_sort empty list
AI-assisted analysis of pola-rs/polars@df599052da (2026-08-16).
Data as JSON: /api/errors/ab9a844063108596.
Report an issue: GitHub.