如何在 polars 表达式中访问列名?

huangapple go评论46阅读模式
英文:

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

以下是翻译好的内容:

  1. .output_name 方法来自元命名空间
pl.col("a").meta.output_name()

# 'a'
  1. 使用条件语句,当 a 等于 1 时选择 b,否则选择 c,然后使用 .output_name() 方法来获取输出名称。
pl.when(pl.col("a") == 1).then(pl.col("b")).otherwise(pl.col("c")).meta.output_name()

# 'b'
  1. 使用条件语句,当 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']
  1. 定义了一个名为 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")))
  1. 输出的表格形状为 (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 │
└──────────┘

huangapple
  • 本文由 发表于 2023年5月17日 18:45:18
  • 转载请务必保留本文链接:https://go.coder-hub.com/76271243.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定