Polars中apply返回元组列表触发BindingsError的解决方法咨询
问题解决:Polars应用函数返回元组列表报错
错误原因
Polars无法直接识别[(字符串, 浮点数)]这种元组列表作为列类型,它仅支持原生的Polars数据类型(比如列表、结构体数组等),因此触发BindingsError。
解决方案
方案1:将结果转为结构体数组列
把元组列表转换成Polars支持的结构体数组,通过map_elements指定返回类型实现:
方式一:直接在lambda中构造结构体
import polars as pl df_polar = df_polar.with_columns( pl.col("text").map_elements( lambda x: [ pl.struct({"label": label, "score": score}) for label, score in zip(classifier(x)["labels"], classifier(x)["scores"]) ], return_dtype=pl.Array(pl.Struct([ pl.Field("label", pl.Utf8), pl.Field("score", pl.Float64) ])) ).alias("text_scores") )
方式二:修改text_scores返回字典列表,再转结构体
先调整text_scores函数返回字典格式:
def text_scores(dict_vals): return [{"label": label, "score": score} for label, score in zip(dict_vals['labels'], dict_vals['scores'])]
然后在Polars中指定返回类型:
df_polar = df_polar.with_columns( pl.col("text").map_elements( lambda x: text_scores(classifier(x)), return_dtype=pl.Array(pl.Struct([ pl.Field("label", pl.Utf8), pl.Field("score", pl.Float64) ])) ).alias("text_scores") )
方案2:展开为多行多列
如果希望每个标签-分数对单独成一行,可以结合explode和unnest:
df_polar = df_polar.with_columns( pl.col("text").map_elements( lambda x: [{"label": l, "score": s} for l, s in zip(classifier(x)["labels"], classifier(x)["scores"])], return_dtype=pl.Array(pl.Struct([("label", pl.Utf8), ("score", pl.Float64)])) ).alias("scores") ).explode("scores").unnest("scores")
执行后,原DataFrame的每行会拆分为4行(对应4个标签),同时生成label和score两个独立列。
方案3:拆分标签和分数为独立列表列
直接提取classifier返回字典中的labels和scores作为两个单独的列表列,无需使用text_scores函数:
df_polar = df_polar.with_columns( pl.col("text").map_elements( lambda x: classifier(x)["labels"], return_dtype=pl.List(pl.Utf8) ).alias("labels"), pl.col("text").map_elements( lambda x: classifier(x)["scores"], return_dtype=pl.List(pl.Float64) ).alias("scores") )
内容的提问来源于stack exchange,提问作者Guess601
相关产品推荐
相关产品推荐

