Polars中str.json_decode解析空字典字符串报错问题求助
解决Polars全空JSON列
json_decode报错问题 当你的meta_data列全是"{}"这种空字典字符串时,调用pl.col('meta_data').str.json_decode()会触发PanicException,提示“a StructArray must contain at least one field”——这是因为Polars没法从空字典里推断出结构体的字段。下面是几种实用的解决办法:
方法1:手动指定空结构体Schema
直接给json_decode明确指定一个空结构体类型,告诉Polars即使没有字段也要生成对应类型:
import polars as pl df = pl.DataFrame({"meta_data": ["{}", "{}"]}) df = df.with_columns( pl.col("meta_data").str.json_decode(pl.Struct([])) )
处理后列会被解析为Struct([])类型,不会触发报错。
方法2:先检测列内容再分支处理
先判断列中所有值是否都是空JSON字典,是的话手动构造空结构体列,否则正常解析:
import polars as pl df = pl.DataFrame({"meta_data": ["{}", "{}"]}) # 检查所有值是否为空JSON字典 all_empty = df.select(pl.col("meta_data").str.json_path_match("$").is_empty()).all().item() if all_empty: df = df.with_columns(pl.lit(pl.Struct([])).alias("meta_data")) else: df = df.with_columns(pl.col("meta_data").str.json_decode())
方法3:用try_catch自动捕获异常处理
利用Polars的try_catch函数捕获解析异常,报错时返回空结构体,兼容全空和混合内容的场景:
import polars as pl df = pl.DataFrame({"meta_data": ["{}", "{}"]}) df = df.with_columns( pl.col("meta_data").str.json_decode().try_catch(pl.Struct([])) )
原理说明
json_decode默认会从列中的JSON数据推断结构体字段。当所有JSON都是空字典时,没有字段可以推断,因此抛出异常;而当列中存在带键值对的JSON时,Polars能从非空JSON提取字段,空字典会被解析为对应结构体的空实例(所有字段为null),所以能正常执行。
内容的提问来源于stack exchange,提问作者apostofes
相关产品推荐
相关产品推荐

