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
如何对列表元素进行操作,或者这可能是嵌套列表创建方式中的一个错误?
下面是三个
pl.DataFrame.with_columns
块
pl.Expr.str.json_decode
),
entityList
字段(使用
pl.Expr.struct.field
),
id
字段。
(
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]] │
└────────────────────────┘