英文:
How do you access a column name in a polars expression?
问题
我在polars中实现了一个sigmoid变换,代码如下:
def sigmoid(c: pl.Expr) -> pl.Expr:
return 1 / ((-c).exp() + 1)
这个实现很好,但是按照polars的命名规范,生成的列名为'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)
然而,polars表达式没有.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)
)
英文:
I implemented a sigmoid transformation in polars as follows:
def sigmoid(c:pl.Expr)->pl.Expr:
return 1 / ((-c).exp() + 1)
This works great, except that by polars naming conventions the resulting column is called 'literal'
I could keep the column name by re-writing sigmoid as
def sigmoid(c:pl.Expr)->pl.Expr:
return ((c * -1).exp() + 1)**-1
But:
A. That is horrible
B. I don't want my code to have this "magical/invisible" tracking of column names
What I'd like to do is add a .alias()
at the end of my function to ensure the column name is preserved.
The following pseudo-code expresses the idea:
def sigmoid(c:pl.Expr)->pl.Expr:
return (1 / ((-c).exp() + 1)).alias(c.name)
However, polars expressions do not have a .name attribute.
How else could I keep the column name?
Not that I could do:
df.select(
pl.col('a').pipe(sigmoid).alias('a'),
pl.col('b').pipe(sigmoid).alias('b'),
pl.col('c').pipe(sigmoid).alias('c'),
...
)
But that is cumbersome, and would not work well with
df.select(
pl.all().pipe(sigmoid)
)
答案1
得分: 1
以下是翻译好的内容:
.output_name
方法来自元命名空间
pl.col("a").meta.output_name()
# 'a'
- 使用条件语句,当
a
等于 1 时选择b
,否则选择c
,然后使用.output_name()
方法来获取输出名称。
pl.when(pl.col("a") == 1).then(pl.col("b")).otherwise(pl.col("c")).meta.output_name()
# 'b'
- 使用条件语句,当
a
等于 1 时选择b
,否则选择c
,然后使用.root_names()
方法来获取根名称列表。
pl.when(pl.col("a") == 1).then(pl.col("b")).otherwise(pl.col("c")).meta.root_names()
# ['b', 'c', 'a']
- 定义了一个名为 sigmoid 的函数,接受一个参数
c
,并返回带有输出名称的表达式。
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")))
- 输出的表格形状为 (3, 1),包含一列名为
a
的浮点数。
shape: (3, 1)
┌──────────┐
│ a │
│ --- │
│ f64 │
╞══════════╡
│ 0.731059 │
│ 0.880797 │
│ 0.952574 │
└──────────┘
英文:
The methods such as .output_name
from the meta namespace.
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 │
└──────────┘
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论