You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何使用Polars的map_elements同时填充多列?

如何使用Polars的map_elements同时填充多列?

没问题!你完全可以通过Struct类型来实现用map_elements一次性生成多列的需求,核心思路是先让自定义函数返回一个结构化的结果(比如字典、元组),再把这个Struct拆分成独立的列。下面给你详细的实现步骤和示例:

方法一:返回字典+指定Struct dtype(推荐)

这种方式最直观,函数返回的字典键就是你想要的列名,Polars会自动把它转换成Struct类型,之后只用unnest就能拆分出多列。

  1. 先定义你的自定义函数,返回包含多值的字典:
def my_complicated_function(row):
    # 这里替换成你的实际处理逻辑
    value1 = row["a"] + row["b"]
    value2 = row["a"] * row["b"]
    value3 = row["a"] - row["b"]
    return {"column1": value1, "column2": value2, "column3": value3}
  1. map_elements生成Struct列,再拆分:
import polars as pl

# 示例DataFrame
df = pl.DataFrame({
    "a": [1, 2, 3],
    "b": [4, 5, 6]
})

# 核心操作
df = df.with_columns(
    pl.struct(pl.all())
      .map_elements(
          my_complicated_function,
          return_dtype=pl.Struct([
              pl.Field("column1", pl.Int64),
              pl.Field("column2", pl.Int64),
              pl.Field("column3", pl.Int64)
          ])
      )
      .alias("temp_struct")  # 先给Struct列起个临时名字
).unnest("temp_struct")  # 把Struct拆分成独立列

print(df)

方法二:返回元组/列表+转Struct

如果你的函数习惯返回元组或列表,也可以先指定返回List类型,再转成Struct后拆分:

  1. 修改函数返回元组:
def my_complicated_function(row):
    value1 = row["a"] + row["b"]
    value2 = row["a"] * row["b"]
    value3 = row["a"] - row["b"]
    return (value1, value2, value3)
  1. 转换并拆分:
df = df.with_columns(
    pl.struct(pl.all())
      .map_elements(my_complicated_function, return_dtype=pl.List(pl.Int64))
      .list.to_struct(fields=["column1", "column2", "column3"])  # 列表转Struct
      .alias("temp_struct")
).unnest("temp_struct")

为什么你原来的写法不行?

alias方法只能给单个列重命名,没办法直接把一个多值结果拆成多列。而Struct类型相当于把多个值打包成一个“容器列”,之后我们只需要把这个容器拆开,就能得到独立的多列了。

注意事项

  • 一定要在map_elements中明确指定return_dtype,Polars需要知道返回的结构类型,避免自动推断出错。
  • 尽量只调用一次map_elements(像上面的示例一样),不要为每列单独调用一次,这样能保证效率,尤其是处理大数据集的时候。

备注:内容来源于stack exchange,提问作者Arne

火山引擎 最新活动