_func用于返回两列:

from polars.type_aliases import IntoExpr, IntoExprColumn
import polars as pl

def _func(x: IntoExpr):
    x1 = x+1
    x2 = x+2
    return pl.struct([x1, x2])
    
df = pl.DataFrame({"test": np.arange(1, 11)})
df.with_columns(
    _func(pl.col("test")).alias(["test1", "test2"])
)

我try 使用pl.struct来包装返回值,但不起作用.

预期输出:

shape: (10, 3)
test test1 test2
i32 i32 i32
1   2   3
2   3   4
3   4   5
4   5   6
5   6   7
6   7   8
7   8   9
8   9   10
9   10  11
10  11  12

推荐答案

我假设您不能或不想更改该函数,因此我们需要处理该函数返回的表达式序列.此外,我希望答案能够容纳超过2列,这样我就不必专门为每列alias.

在您的例子中,问题是在最后您有一个同名的Expr序列,所以您需要在执行之前的某个时刻重命名它们.

解决方案可能取决于您计划为列使用哪种名称. 您可以这样做:

def _func(x: IntoExpr):
    x1 = x+1
    x2 = x+2
    return x1, x2

df.with_columns(
    x.alias(f"test{i+1}") for i,x in enumerate(_func(pl.col("test")))
)

# alternatevely
# df.with_columns(
#    x.name.suffix(f"{i+1}") for i,x in enumerate(_func(pl.col("test")))
#)

┌──────┬───────┬───────┐
│ test ┆ test1 ┆ test2 │
│ ---  ┆ ---   ┆ ---   │
│ i32  ┆ i32   ┆ i32   │
╞══════╪═══════╪═══════╡
│ 1    ┆ 2     ┆ 3     │
│ 2    ┆ 3     ┆ 4     │
│ 3    ┆ 4     ┆ 5     │
│ 4    ┆ 5     ┆ 6     │
│ 5    ┆ 6     ┆ 7     │
│ 6    ┆ 7     ┆ 8     │
│ 7    ┆ 8     ┆ 9     │
│ 8    ┆ 9     ┆ 10    │
│ 9    ┆ 10    ┆ 11    │
│ 10   ┆ 11    ┆ 12    │
└──────┴───────┴───────┘

对于自定义名称,您可以使用zip:

f.with_columns(
    x.alias(n) for x, n in zip(_func(pl.col('test')), ["a","b"])
)

┌──────┬─────┬─────┐
│ test ┆ a   ┆ b   │
│ ---  ┆ --- ┆ --- │
│ i32  ┆ i32 ┆ i32 │
╞══════╪═════╪═════╡
│ 1    ┆ 2   ┆ 3   │
│ 2    ┆ 3   ┆ 4   │
│ 3    ┆ 4   ┆ 5   │
│ 4    ┆ 5   ┆ 6   │
│ 5    ┆ 6   ┆ 7   │
│ 6    ┆ 7   ┆ 8   │
│ 7    ┆ 8   ┆ 9   │
│ 8    ┆ 9   ┆ 10  │
│ 9    ┆ 10  ┆ 11  │
│ 10   ┆ 11  ┆ 12  │
└──────┴─────┴─────┘

或者,您可以使用with_columns()接受**named_exprs作为参数的事实,将表达式列表转换为DICT并解压缩:

df.with_columns(
    **dict(zip(['a','b'], _func(pl.col('test'))))
)

┌──────┬─────┬─────┐
│ test ┆ a   ┆ b   │
│ ---  ┆ --- ┆ --- │
│ i32  ┆ i32 ┆ i32 │
╞══════╪═════╪═════╡
│ 1    ┆ 2   ┆ 3   │
│ 2    ┆ 3   ┆ 4   │
│ 3    ┆ 4   ┆ 5   │
│ 4    ┆ 5   ┆ 6   │
│ 5    ┆ 6   ┆ 7   │
│ 6    ┆ 7   ┆ 8   │
│ 7    ┆ 8   ┆ 9   │
│ 8    ┆ 9   ┆ 10  │
│ 9    ┆ 10  ┆ 11  │
│ 10   ┆ 11  ┆ 12  │
└──────┴─────┴─────┘

Python相关问答推荐

为什么tkinter框架没有被隐藏?

为什么我的Python代码在if-else声明中的行之前执行if-else声明中的行?

如何从在虚拟Python环境中运行的脚本中运行需要宿主Python环境的Shell脚本?

Polars:用氨纶的其他部分替换氨纶的部分

无法使用requests或Selenium抓取一个href链接

如何在python polars中停止otherate(),当使用when()表达式时?

Pandas Loc Select 到NaN和值列表

通过ManyToMany字段与Through在Django Admin中过滤

使用Python查找、替换和调整PDF中的图像'

从列表中获取n个元素,其中list [i][0]== value''

Django Table—如果项目是唯一的,则单行

在第一次调用时使用不同行为的re. sub的最佳方式

Python如何导入类的实例

有了Gekko,可以创建子模型或将模型合并在一起吗?

在Pandas 中以十六进制显示/打印列?

是否需要依赖反转来确保呼叫方和被呼叫方之间的分离?

奇怪的Base64 Python解码

如何通过函数的强式路径动态导入函数?

生产者/消费者-Queue.get by list

Fake pathlib.使用pyfakefs的类变量中的路径'