Polars中map_elements与isinstance判断失效引发SchemaError问题求助
问题分析
你遇到的核心问题是Polars的list类型元素不是Python原生list,而是Polars自己实现的ListScalar对象。所以你的isinstance(x, list)判断会返回False,导致lambda直接返回原ListScalar,后续调用.str.to_lowercase()时,因为列类型还是list[str]而非字符串,触发SchemaError。
如果强行加return_dtype=pl.String,Polars会把ListScalar直接转成带括号和引号的字符串(比如"['hello', 'World']"),自然不符合预期。
解决方案
优先使用Polars原生向量化表达式(性能远优于map_elements的逐元素Python循环),也可以修改map_elements的判断逻辑适配Polars类型。
方案一:原生表达式分支处理(推荐)
利用Polars的pl.when根据列类型分支处理,完全避免Python循环:
import polars as pl def process_column(column_name: str, alias_name: str) -> pl.Expr: col = pl.col(column_name) return ( # 先区分列类型:list列先转成空格连接的字符串,字符串列直接处理 pl.when(col.dtype.is_list()) .then(col.list.join(" ").str.to_lowercase()) .otherwise(col.str.to_lowercase()) # 统一执行分割和重新连接逻辑 .str.split(by="-") .list.join(" ") .alias(alias_name) ) # 测试示例 df = pl.DataFrame({ "lists": [["hello", "World"], ["polars", "IS", "fast"]], "strings": ["foo-hello", "bOO"] }) # 处理两列 result = df.with_columns([ process_column("lists", "processed_lists"), process_column("strings", "processed_string") ]) print(result)
输出结果:
shape: (2, 4) ┌─────────────────────┬─────────────┬──────────────────┬────────────────────┐ │ lists ┆ strings ┆ processed_lists ┆ processed_string │ │ --- ┆ --- ┆ --- ┆ --- │ │ list[str] ┆ str ┆ str ┆ str │ ╞═════════════════════╪═════════════╪══════════════════╪════════════════════╡ │ ["hello", "World"] ┆ foo-hello ┆ hello world ┆ foo hello │ │ ["polars", "IS", …] ┆ bOO ┆ polars is fast ┆ boo │ └─────────────────────┴─────────────┴──────────────────┴────────────────────┘
方案二:修改map_elements的判断逻辑
如果一定要用map_elements,需要判断Polars的ListScalar类型,把它转成Python原生list后再处理:
import polars as pl def process_column(column_name: str, alias_name: str) -> pl.Expr: return ( pl.col(column_name).map_elements( # 判断是否是Polars的List类型,转成原生list后join lambda x: " ".join(x.to_list()) if isinstance(x, pl.List) else x, return_dtype=pl.String # 明确指定输出为字符串类型 ) .str.to_lowercase() .str.split(by="-") .list.join(" ") .alias(alias_name) )
这个方案能解决类型判断问题,但性能远不如方案一,不建议处理大数据集时使用。
内容的提问来源于stack exchange,提问作者abolfazl taghribi
相关产品推荐
相关产品推荐

