0

有没有一种优雅的方式来重新编码 Polars 数据框中的值。

例如

1->0, 
2->0, 
3->1... 

在 Pandas 中很简单:

df.replace([1,2,3,4,97,98,99],[0,0,1,1,2,2,2])
4

1 回答 1

2

if else statetements在极坐标中,您可以构建称为if -> then -> otherwise表达式的柱状。

所以假设我们有这个DataFrame

df = pl.DataFrame({
    "a": [1, 2, 3, 4, 5]
})

我们想用以下值替换它们:

from_ = [1, 2]
to_ = [99, 12]

我们可以写:

df.with_column(
    pl.when(pl.col("a") == from_[0])
    .then(to_[0])
    .when(pl.col("a") == from_[1])
    .then(to_[1])
    .otherwise(pl.col("a")).alias("a")
)
shape: (5, 1)
┌─────┐
│ a   │
│ --- │
│ i64 │
╞═════╡
│ 99  │
├╌╌╌╌╌┤
│ 12  │
├╌╌╌╌╌┤
│ 3   │
├╌╌╌╌╌┤
│ 4   │
├╌╌╌╌╌┤
│ 5   │
└─────┘

不要重复自己

现在,写得很快就变得非常乏味,所以我们可以编写一个函数来生成这些表达式以供使用,我们是程序员,不是吗!

因此,要替换为您建议的值,您可以执行以下操作:

from_ = [1,2,3,4,97,98,99]
to_ = [0,0,1,1,2,2,2]


def replace(column, from_, to_):
    # initiate the expression with `pl.when`
    branch =  pl.when(pl.col(column) == from_[0]).then(to_[0])

    
    # for every value add a `when.then`
    for (from_value, to_value) in zip(from_, to_):
        branch = branch.when(pl.col(column) == from_value).then(to_value)

    # finish with an `otherwise`
    return branch.otherwise(pl.col(column)).alias(column)
    


df.with_column(replace("a", from_, to_))

哪个输出:

shape: (5, 1)
┌─────┐
│ a   │
│ --- │
│ i64 │
╞═════╡
│ 0   │
├╌╌╌╌╌┤
│ 0   │
├╌╌╌╌╌┤
│ 1   │
├╌╌╌╌╌┤
│ 1   │
├╌╌╌╌╌┤
│ 5   │
└─────┘
于 2022-02-03T15:48:22.947 回答