我在极坐标中实现了 sigmoid 变换,如下所示:
def sigmoid(c:pl.Expr)->pl.Expr:
return 1 / ((-c).exp() + 1)
这非常有效,除了根据极坐标命名约定,生成的列称为
'literal'
我可以通过将 sigmoid 重写为来保留列名称
def sigmoid(c:pl.Expr)->pl.Expr:
return ((c * -1).exp() + 1)**-1
但是: A.那太可怕了 B. 我不希望我的代码有这种“神奇/不可见”的列名称跟踪
我想做的是在函数末尾添加一个
.alias()
以确保保留列名称。
下面的伪代码表达了这个想法:
def sigmoid(c:pl.Expr)->pl.Expr:
return (1 / ((-c).exp() + 1)).alias(c.name)
但是,极坐标表达式没有 .name 属性。
我还能如何保留列名称?
我做不到:
df.select(
pl.col('a').pipe(sigmoid).alias('a'),
pl.col('b').pipe(sigmoid).alias('b'),
pl.col('c').pipe(sigmoid).alias('c'),
...
)
但这很麻烦,并且不能很好地配合
df.select(
pl.all().pipe(sigmoid)
)
.name.keep()
防止DuplicateError
df.with_columns(pl.all().pipe(sigmoid).name.keep())
shape: (3, 3)
┌──────────┬──────────┬──────────┐
│ a ┆ b ┆ c │
│ --- ┆ --- ┆ --- │
│ f64 ┆ f64 ┆ f64 │
╞══════════╪══════════╪══════════╡
│ 0.731059 ┆ 0.982014 ┆ 0.999089 │
│ 0.880797 ┆ 0.993307 ┆ 0.999665 │
│ 0.952574 ┆ 0.997527 ┆ 0.999877 │
└──────────┴──────────┴──────────┘
原答案。
在
meta命名空间中有
.output_name
等内省方法。
pl.col("a").meta.output_name()
# 'a'
pl.when(pl.col("a") == 1).then(pl.col("b")).otherwise(pl.col("c")).meta.output_name()
# 'b'
pl.when(pl.col("a") == 1).then(pl.col("b")).otherwise(pl.col("c")).meta.root_names()
# ['b', 'c', 'a']
def sigmoid(c:pl.Expr)->pl.Expr:
return (1 / ((-c).exp() + 1)).alias(c.meta.output_name())
pl.DataFrame(dict(a = [1, 2, 3])).select(sigmoid(pl.col("a")))
shape: (3, 1)
┌──────────┐
│ a │
│ --- │
│ f64 │
╞══════════╡
│ 0.731059 │
│ 0.880797 │
│ 0.952574 │
└──────────┘