极地:`list.eval()`上下文中`pl.element()`上的`json_path_match`

问题描述 投票:0回答:1
我正在尝试对列表中的每个元素(字符串)执行 JSON 路径匹配。我观察到以下行为:

import polars as pl data = [ '{"text":"asdf","entityList":[{"mybool":true,"id":1},{"mybool":true,"id":2},{"mybool":false,"id":3}]}', '{"text":"asdf","entityList":[{"mybool":false,"id":1},{"mybool":true,"id":2},{"mybool":false,"id":3}]}', ] df = pl.DataFrame({"data": [data]}) print(df) # shape: (1, 1) # ┌─────────────────────────────────┐ # │ data │ # │ --- │ # │ list[str] │ # ╞═════════════════════════════════╡ # │ ["{"text":"asdf","entityList":… │ # └─────────────────────────────────┘ expr1 = pl.col("data").list.eval(pl.element().str.json_path_match("$.entityList[*].id")) print(df.select(expr1)) # shape: (1, 1) # ┌────────────┐ # │ data │ # │ --- │ # │ list[str] │ # ╞════════════╡ # │ ["1", "1"] │ # └────────────┘ expr2 = pl.col("data").list.eval(pl.element().str.json_path_match("$.entityList[*].id").flatten()) print(df.select(expr2)) # shape: (1, 1) # ┌────────────┐ # │ data │ # │ --- │ # │ list[str] │ # ╞════════════╡ # │ ["1", "1"] │ # └────────────┘
我对 JSON 路径的理解是 

$.entityList[*].id

 应该提取 
id
 中每个元素的 
entityList
,因此我期望以下结果:

shape: (1, 1) ┌────────────────────────┐ │ data │ │ --- │ │ list[list[i64]] │ ╞════════════════════════╡ │ [[1, 2, 3], [1, 2, 3]] │ └────────────────────────┘
我是否误解了

json_path_match

如何对列表元素进行操作,或者这可能是嵌套列表创建方式中的一个错误?

dataframe python-polars jsonpath
1个回答
0
投票
如评论中所述,

pl.Expr.str.json_path_match

目前仅提取first匹配。

仍然可以通过解码整个 JSON 字符串并在解码的结构中进行适当的选择来获得预期的结果。

下面是三个

pl.DataFrame.with_columns

( df .with_columns( pl.col("data").list.eval( pl.element().str.json_decode() ) ) .with_columns( pl.col("data").list.eval( pl.element().struct.field("entityList") ) ) .with_columns( pl.col("data").list.eval( pl.element().list.eval( pl.element().struct.field("id") ) ) ) )
shape: (1, 1)
┌────────────────────────┐
│ data                   │
│ ---                    │
│ list[list[i64]]        │
╞════════════════════════╡
│ [[1, 2, 3], [1, 2, 3]] │
└────────────────────────┘
    
© www.soinside.com 2019 - 2024. All rights reserved.