要将多列设置为相同的值,您可以使用:
df.with_columns(
pl.when(pl.col("A").is_in(["foo", "spam"]))
.then(pl.lit("XX"))
.otherwise(pl.col("L", "G"))
.keep_name()
)
shape: (4, 3)
┌──────┬─────┬─────┐
│ A ┆ L ┆ G │
│ --- ┆ --- ┆ --- │
│ str ┆ str ┆ str │
╞══════╪═════╪═════╡
│ foo ┆ XX ┆ XX │
│ ham ┆ A12 ┆ C84 │
│ spam ┆ XX ┆ XX │
│ egg ┆ C12 ┆ L6 │
└──────┴─────┴─────┘
.is_in()
可以使用而不是多个== x | == y
chains.
要使用不同的值一次更新多个列,您可以使用.map()
和一本字典:
df.with_columns(
pl.when(pl.col("A").is_in(["foo", "spam"]))
.then(pl.col("L", "G").map(
lambda col: {
"L": "XX",
"G": "YY",
}.get(col.name)))
.otherwise(pl.col("L", "G"))
)
shape: (4, 3)
┌──────┬─────┬─────┐
│ A ┆ L ┆ G │
│ --- ┆ --- ┆ --- │
│ str ┆ str ┆ str │
╞══════╪═════╪═════╡
│ foo ┆ XX ┆ YY │
│ ham ┆ A12 ┆ C84 │
│ spam ┆ XX ┆ YY │
│ egg ┆ C12 ┆ L6 │
└──────┴─────┴─────┘
使用时.map
整个列都被传递(作为pl.Series
)意味着您也可以根据需要操纵它:
df.with_columns(
pl.when(pl.col("A").is_in(["foo", "spam"]))
.then(pl.col("L", "G").map(
lambda col: {
"L": col.str.to_lowercase(),
"G": "prefix_" + col
}.get(col.name)))
.otherwise(pl.col("L", "G"))
)
shape: (4, 3)
┌──────┬─────┬────────────┐
│ A ┆ L ┆ G │
│ --- ┆ --- ┆ --- │
│ str ┆ str ┆ str │
╞══════╪═════╪════════════╡
│ foo ┆ a54 ┆ prefix_X34 │
│ ham ┆ A12 ┆ C84 │
│ spam ┆ b84 ┆ prefix_G96 │
│ egg ┆ C12 ┆ L6 │
└──────┴─────┴────────────┘