Polars中是否有惯用的报错抛出方式?数据处理需精准错误提示
在Polars中触发明确的数据校验错误提示
要在数据不满足条件时抛出明确错误而非返回null,可以通过先校验数据合法性,再执行转换的原生方式实现,无需用UDF绕路:
步骤1:定义校验条件并筛选异常行
先把不符合匹配规则的行筛选出来,拿到具体的异常数据后再抛出带详情的错误:
import polars as pl lf = pl.LazyFrame( { "first_and_middle_name": ["mister banana", "yoda the jedi", "not gonna"], "middle_and_last_name": ["banana muffin", "jedi master", "work at all"], } ) # 定义拆分和匹配条件 split_first_name = pl.col("first_and_middle_name").str.split(" ").list split_last_name = pl.col("middle_and_last_name").str.split(" ").list match_condition = split_first_name.last() == split_last_name.first() # 筛选出不满足条件的行 invalid_rows = lf.filter(~match_condition).collect() # 如果存在异常行,抛出带详情的错误 if not invalid_rows.is_empty(): error_msg = f"发现{len(invalid_rows)}行数据不匹配规则:\n{invalid_rows}" raise ValueError(error_msg) # 确认数据合法后执行转换 result = lf.with_columns( (pl.col("first_and_middle_name") + " " + split_last_name.slice(1).list.join(" ")) .alias("full_name") ).collect() print(result)
步骤2:错误信息说明
运行上述代码后,会直接抛出包含异常行详情的错误:
ValueError: 发现1行数据不匹配规则: shape: (1, 2) ┌──────────────────────┬─────────────────────┐ │ first_and_middle_name ┆ middle_and_last_name │ │ --- ┆ --- │ │ str ┆ str │ ╞══════════════════════╪═════════════════════╡ │ not gonna ┆ work at all │ └──────────────────────┴─────────────────────┘
这种方式既保留了Polars的矢量运算性能,又能精准定位异常数据的具体内容,比UDF更高效直接。
内容的提问来源于stack exchange,提问作者nadavge
相关产品推荐
相关产品推荐

