Polars列表元素行级处理:如何用when/then/otherwise生成词向量
Polars实现列表元素词向量映射(修复迭代报错)
数据结构与需求
原始DataFrame结构:
| Column x | Column y |
|---|---|
| 1 | [mike,kim] |
| 2 | [ken,nate,lara] |
需求:遍历每行Column y中的姓名列表,生成词向量列z:
- 若姓名存在于
model_vocab_list,则获取对应词向量 - 否则生成维度与词向量一致的零向量
最终新增z列存储对应词向量列表。
问题现状
尝试的Polars表达式报错'Expr' object is not iterable,以下是报错代码及可行的Pandas实现:
报错的Polars代码
# 报错的Polars表达式 expression = pl.when(pl.element().is_in(model_vocab_list)).then(name_model.wv[pl.element()]).otherwise(np.zeros(name_model.wv.vector_size, dtype="float32")) pl_df = df_pl.with_columns( pl.col('y') ).select( pl.all(), pl.col("y").list.eval(expression).alias("z") )
可行的Pandas代码
ddf['z'] = ddf['y'].apply(lambda x: [model.wv[word] if word in model_vocab_list else np.zeros(model.wv.vector_size, dtype="float32") for word in x])
修正后的Polars代码
import polars as pl import numpy as np # 定义单元素处理函数 def get_word_vector(word): if word in model_vocab_list: return name_model.wv[word] else: return np.zeros(name_model.wv.vector_size, dtype="float32") # 生成z列 pl_df = df_pl.with_columns( pl.col("y").list.map_elements(get_word_vector, return_dtype=pl.Array(pl.Float32, name_model.wv.vector_size)).alias("z") )
修正说明
报错原因是直接在Polars表达式中使用name_model.wv[pl.element()]——Polars的Expr对象无法被Python的索引操作直接迭代处理。改用list.map_elements将Python层面的词向量查询逻辑包装成可被Polars调用的函数,同时指定返回类型为对应维度的Array,确保类型匹配。
内容的提问来源于stack exchange,提问作者user1753372
相关产品推荐
相关产品推荐

