You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Polars DataFrame中应用自定义函数创建新变量时遇报错

问题分析与解决方案

错误原因

你使用map_elements时,lambda函数接收的是单个元素值而非整列数据。此时调用pl.mean(x),Polars会将数值类型的x误认为是列名(pl.mean()要求参数为列名字符串或数据类型),因此抛出类型错误。

正确写法

Polars是向量化计算框架,无需逐元素处理,直接用表达式对整列操作即可实现需求:

import polars as pl

df = pl.DataFrame({
    "a": [1, 8, 3],
    "b": [4, 5, 9]
})

# 对所有列执行 (列值 - 列均值)/列值 的计算,并添加后缀_x
result = df.with_columns(
    (pl.all() - pl.all().mean()) / pl.all()
    .name.suffix('_x')
)

print(result)

运行结果:

shape: (3, 4)
┌─────┬─────┬───────────┬───────────┐
│ a   ┆ b   ┆ a_x       ┆ b_x       │
│ --- ┆ --- ┆ ---       ┆ ---       │
│ i64 ┆ i64 ┆ f64       ┆ f64       │
╞═════╪═════╪═══════════╪═══════════╡
│ 1   ┆ 4   ┆ -3.0      ┆ -0.5      │
│ 8   ┆ 5   ┆ 0.5       ┆ -0.2      │
│ 3   ┆ 9   ┆ -0.333333 ┆ 0.333333  │
└─────┴─────┴───────────┴───────────┘

补充说明

  • pl.all()代表所有列,也可以用pl.col("*")替代,效果一致
  • 向量化操作比逐元素映射(map_elements)效率高得多,这也是Polars的核心优势之一
  • 若确实需要逐元素处理,需确保lambda函数内的操作是针对单个值的,而非列级计算

内容的提问来源于stack exchange,提问作者ViSa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 03:00:59