在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
相关产品推荐
相关产品推荐

