polars.when#
- polars.when(
- *predicates: IntoExprColumn | Iterable[IntoExprColumn] | bool,
- **constraints: Any,
Start a
when-then-otherwiseexpression.Expression similar to an
if-elsestatement in Python. Always initiated by apl.when(<condition>).then(<value if condition>)., and optionally followed by chaining one or more.when(<condition>).then(<value>)statements.Chained when-then operations should be read as Python
if, elif, ... elifblocks, not asif, if, ... if, i.e. the first condition that evaluates to True will be picked.If none of the conditions are
True, an optional.otherwise(<value if all statements are false>)can be appended at the end. If not appended, and none of the conditions areTrue,Nonewill be returned.- Parameters:
- predicates
Condition(s) that must be met in order to apply the subsequent statement. Accepts one or more boolean expressions, which are implicitly combined with
&. String input is parsed as a column name.- constraints
Apply conditions as
col_name = valuekeyword arguments that are treated as equality matches, such asx = 123. As with the predicates parameter, multiple conditions are implicitly combined using&.
Warning
Polars computes all expressions passed to
when-then-otherwisein parallel and filters afterwards. This means each expression must be valid on its own, regardless of the conditions in thewhen-then-otherwisechain.Examples
Below we add a column with the value 1, where column “foo” > 2 and the value -1 where it isn’t.
>>> df = pl.DataFrame({"foo": [1, 3, 4], "bar": [3, 4, 0]}) >>> df.with_columns(pl.when(pl.col("foo") > 2).then(1).otherwise(-1).alias("val")) shape: (3, 3) ┌─────┬─────┬─────┐ │ foo ┆ bar ┆ val │ │ --- ┆ --- ┆ --- │ │ i64 ┆ i64 ┆ i32 │ ╞═════╪═════╪═════╡ │ 1 ┆ 3 ┆ -1 │ │ 3 ┆ 4 ┆ 1 │ │ 4 ┆ 0 ┆ 1 │ └─────┴─────┴─────┘
Or with multiple when-then operations chained:
>>> df.with_columns( ... pl.when(pl.col("foo") > 2) ... .then(1) ... .when(pl.col("bar") > 2) ... .then(4) ... .otherwise(-1) ... .alias("val") ... ) shape: (3, 3) ┌─────┬─────┬─────┐ │ foo ┆ bar ┆ val │ │ --- ┆ --- ┆ --- │ │ i64 ┆ i64 ┆ i32 │ ╞═════╪═════╪═════╡ │ 1 ┆ 3 ┆ 4 │ │ 3 ┆ 4 ┆ 1 │ │ 4 ┆ 0 ┆ 1 │ └─────┴─────┴─────┘
Note how in the example above for the second row in the DataFrame, where
foo=3andbar=4, the firstwhenevaluates toTrue, and therefore the secondwhen, which is alsoTrue, is not evaluated.The
otherwiseat the end is optional. If left out, any rows where none of thewhenexpressions evaluate to True, are set tonull:>>> df.with_columns(pl.when(pl.col("foo") > 2).then(1).alias("val")) shape: (3, 3) ┌─────┬─────┬──────┐ │ foo ┆ bar ┆ val │ │ --- ┆ --- ┆ --- │ │ i64 ┆ i64 ┆ i32 │ ╞═════╪═════╪══════╡ │ 1 ┆ 3 ┆ null │ │ 3 ┆ 4 ┆ 1 │ │ 4 ┆ 0 ┆ 1 │ └─────┴─────┴──────┘
Pass multiple predicates, each of which must be met:
>>> df.with_columns( ... val=pl.when( ... pl.col("bar") > 0, ... pl.col("foo") % 2 != 0, ... ) ... .then(99) ... .otherwise(-1) ... ) shape: (3, 3) ┌─────┬─────┬─────┐ │ foo ┆ bar ┆ val │ │ --- ┆ --- ┆ --- │ │ i64 ┆ i64 ┆ i32 │ ╞═════╪═════╪═════╡ │ 1 ┆ 3 ┆ 99 │ │ 3 ┆ 4 ┆ 99 │ │ 4 ┆ 0 ┆ -1 │ └─────┴─────┴─────┘
Pass conditions as keyword arguments:
>>> df.with_columns(val=pl.when(foo=4, bar=0).then(99).otherwise(-1)) shape: (3, 3) ┌─────┬─────┬─────┐ │ foo ┆ bar ┆ val │ │ --- ┆ --- ┆ --- │ │ i64 ┆ i64 ┆ i32 │ ╞═════╪═════╪═════╡ │ 1 ┆ 3 ┆ -1 │ │ 3 ┆ 4 ┆ -1 │ │ 4 ┆ 0 ┆ 99 │ └─────┴─────┴─────┘