You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 01:15:42