Python Polars中如何将JSON字符串列转为字典并过滤数据?
在Python Polars中处理JSON字符串列的过滤需求
Polars针对JSON字符串列的过滤场景,推荐用内置的矢量化JSON操作,比手动转字典再逐行判断效率高得多,下面分场景给出具体实现:
先准备示例数据
假设你的DataFrame长这样:
import polars as pl df = pl.DataFrame({ "id": [1, 2, 3, 4], "tags": [ '{"priority": "high", "status": "active"}', '{"status": "inactive"}', '{"category": "urgent", "priority": "medium"}', '{"category": "routine"}' ] })
场景1:过滤包含特定标签键的行
比如要保留包含priority键的行,有两种高效方式:
方式1:直接用JSON路径检查键存在(无需完全解析JSON)
这种方法性能最优,因为不需要把整个JSON字符串解析成结构体,只检查路径是否存在:
filtered_df = df.filter(pl.col("tags").str.json_path_exists("$.priority"))
方式2:先解析为Struct,再检查字段非空
如果后续还要用到其他标签字段,先把JSON解析成Struct类型更方便,之后通过判断字段是否非空来筛选:
# 先解析JSON为Struct列 parsed_df = df.with_columns(pl.col("tags").str.json_decode().alias("tags_struct")) # 筛选出priority字段不为空的行 filtered_df = parsed_df.filter(pl.col("tags_struct").struct.field("priority").is_not_null())
场景2:过滤标签值符合条件的行
比如要保留status值为active的行,同样有两种方式:
方式1:用JSON路径匹配值
直接通过JSON路径定位到值并匹配:
filtered_df = df.filter(pl.col("tags").str.json_path_match("$.status", "active"))
方式2:解析后直接比较值
如果已经解析成Struct列,直接做值比较即可:
parsed_df = df.with_columns(pl.col("tags").str.json_decode().alias("tags_struct")) filtered_df = parsed_df.filter(pl.col("tags_struct").struct.field("status") == "active")
特殊情况:JSON结构不固定
如果你的tags列JSON结构不稳定(比如有的是数组、有的键完全不同),可以转成Object类型后用map_elements逐行处理,但这种方法性能不如矢量化操作,尽量少用:
filtered_df = df.filter( pl.col("tags").str.json_decode(pl.Object).map_elements( lambda d: "priority" in d or d.get("status") == "active", return_dtype=pl.Boolean ) )
内容的提问来源于stack exchange,提问作者Glenn Pierce
相关产品推荐
相关产品推荐

