如何访问极坐标表达式中的列名称?

问题描述 投票:0回答:1

我在极坐标中实现了 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)
)
python-polars
1个回答
5
投票

更新:您可以使用原来的功能

.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 │
└──────────┘
© www.soinside.com 2019 - 2024. All rights reserved.