在Python Polars中,我想知道是否可以使用.eval()来执行元素和列之间的操作.例如,给定以下数据帧:

import polars as pl

df = pl.DataFrame({"list": [[2, 2, 2], [3, 3, 3]], "scalar": [1, 2]})

可以用scalar列的值减go list列中的每个元素吗? 即从这个开始

shape: (2, 2)
┌───────────┬────────┐
│ list      ┆ scalar │
│ ---       ┆ ---    │
│ list[i64] ┆ i64    │
╞═══════════╪════════╡
│ [2, 2, 2] ┆ 1      │
│ [3, 3, 3] ┆ 2      │
└───────────┴────────┘

对此

shape: (2, 3)
┌───────────┬────────┬───────────┐
│ list      ┆ scalar ┆ diff      │
│ ---       ┆ ---    ┆ ---       │
│ list[i64] ┆ i64    ┆ list[i64] │
╞═══════════╪════════╪═══════════╡
│ [2, 2, 2] ┆ 1      ┆ [1, 1, 1] │
│ [3, 3, 3] ┆ 2      ┆ [1, 1, 1] │
└───────────┴────────┴───────────┘

推荐答案

我认为这方面的原生功能已在路由图中列出(请参阅GitHub第https://github.com/pola-rs/polars/issues/8006期),但您可以按如下方式完成:

df = df.with_row_count().pipe(
    lambda df: df.join(
        df.explode("list")
        .with_columns(sub=pl.col("list") - pl.col("scalar"))
        .groupby("row_nr")
        .agg(pl.col("sub")),
        on="row_nr",
    )
)

基本上,我添加了一个row_nr列,以使每一行都有一个唯一的ID.然后通过管道连接,这样我就可以在进一步的操作中使用这个row_nr列.我做了一个连接来添加算术列.在联接中,我分解List列以将其作为行,执行算术运算,然后执行GROUPBY,将每行的内容收集回一个列表中,并将这个新列联接回df.

我相信还有其他方法可以做到这一点,但这应该会让你继续前进

Python相关问答推荐

在Python中为变量的缺失值创建虚拟值

使用GEKKO在简单DTE系统中进行一致初始化

在Python和matlab中显示不同 colored颜色 的图像

使用mySQL的SQlalchemy过滤重叠时间段

如何在类和classy-fastapi -fastapi- followup中使用FastAPI创建路由

根据二元组列表在pandas中创建新列

使用groupby Pandas的一些操作

计算每个IP的平均值

使用NeuralProphet绘制置信区间时出错

如果满足某些条件,则用另一个数据帧列中的值填充空数据帧或数组

如何根据一列的值有条件地 Select 前N组?

如何在表中添加重复的列?

字符串合并语法在哪里记录

python中的解释会在后台调用函数吗?

寻找Regex模式返回与我当前函数类似的结果

Gunicorn无法启动Flask应用,因为无法将应用解析为属性名或函数调用.'"'' "

使用字典或列表的值组合

如何将一组组合框重置回无 Select tkinter?

如何将返回引用的函数与pybind11绑定?

类型对象';敌人';没有属性';损害';