{"record":{"id":"6b4638d1e8836565","repo":"pola-rs/polars","slug":"expected-at-least-one-series-in-coalesce-if-eag","errorCode":null,"errorMessage":"expected at least one Series in 'coalesce' if 'eager=True'","messagePattern":"expected at least one Series in 'coalesce' if 'eager=True'","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"py-polars/src/polars/functions/lazy.py","lineNumber":2414,"sourceCode":"    │ null ┆ null ┆ null ┆ 10.0 │\n    └──────┴──────┴──────┴──────┘\n\n    >>> s1 = pl.Series(\"a\", [None, 2, None])\n    >>> s2 = pl.Series(\"b\", [1, None, 3])\n    >>> pl.coalesce(s1, s2, eager=True)\n    shape: (3,)\n    Series: 'a' [i64]\n    [\n        1\n        2\n        3\n    ]\n    \"\"\"\n    if eager:\n        exprs = [exprs, *more_exprs]\n        if not (series := [e for e in exprs if isinstance(e, pl.Series)]):\n            msg = \"expected at least one Series in 'coalesce' if 'eager=True'\"\n            raise ValueError(msg)\n\n        exprs = [(e.name if isinstance(e, pl.Series) else e) for e in exprs]\n        return pl.DataFrame(series).select(coalesce(exprs, eager=False)).to_series()\n    else:\n        exprs = parse_into_list_of_expressions(exprs, *more_exprs)\n        return wrap_expr(plr.coalesce(exprs))\n\n\n@overload\ndef from_epoch(column: str | Expr, time_unit: EpochTimeUnit = ...) -> Expr: ...\n\n\n@overload\ndef from_epoch(\n    column: Series | Sequence[int | float], time_unit: EpochTimeUnit = ...\n) -> Series: ...\n\n","sourceCodeStart":2396,"sourceCodeEnd":2432,"githubUrl":"https://github.com/pola-rs/polars/blob/fe841f959ef4d2ceefc05a310d33ed7b1ab24e5e/py-polars/src/polars/functions/lazy.py#L2396-L2432","documentation":"`pl.coalesce(exprs, *more_exprs, eager=True)` filters the inputs for Series to build the backing DataFrame; if none of the inputs is a `pl.Series`, ValueError is raised. Strings/Exprs require lazy mode or at least one Series in eager mode.","triggerScenarios":"`pl.coalesce([\"a\", \"b\"], eager=True)` — all string column names with eager=True.","commonSituations":"Using eager mode with column-name strings; porting lazy code to eager without converting columns via `df[\"col\"]`.","solutions":["Pass Series: `pl.coalesce([df[\"a\"], df[\"b\"]], eager=True)`","Use lazy form: `df.select(pl.coalesce(\"a\", \"b\"))`","Remove `eager=True` if lazy was intended"],"exampleFix":"// before\npl.coalesce([\"a\", \"b\"], eager=True)\n// after\npl.coalesce([df[\"a\"], df[\"b\"]], eager=True)","handlingStrategy":"type-guard","validationCode":"def coalesce_eager(*exprs):\n    if not any(isinstance(e, pl.Series) for e in exprs):\n        raise TypeError(\"coalesce(eager=True) needs at least one pl.Series\")\n    return pl.coalesce(list(exprs), eager=True)","typeGuard":"def coalesce_eager_ok(exprs): return any(isinstance(e, pl.Series) for e in exprs)","tryCatchPattern":"try:\n    return pl.coalesce(exprs, eager=True)\nexcept ValueError:\n    return df.select(pl.coalesce(*exprs))","preventionTips":["Convert name strings to df[\"col\"] Series in eager mode","Use df.select(pl.coalesce(...)) for column names","Don't pass only strings with eager=True"],"tags":["python","polars","eager","arguments"],"backgroundTag":"invalid-argument-value","analyzedSha":"fe841f959ef4d2ceefc05a310d33ed7b1ab24e5e","analyzedAt":"2026-09-18T22:14:11.667Z","contentChangedAt":"2026-09-18T22:14:11.667Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}