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

如何使用polars.Expr.list.sort按结构体字段排序结构体列表

问题:如何使用polars.Expr.list.sort按结构体中的某个值对结构体列表排序

给定如下DataFrame:

import polars as pl

df = pl.DataFrame([{"id": 1, "data": [{"key": "A", "value": 2}, {"key": "B", "value": 1}]}])

输出结构:

shape: (1, 2)
┌─────┬────────────────────┐
│ id  ┆ data               │
│ --- ┆ ---                │
│ i64 ┆ list[struct[2]]    │
╞═════╪════════════════════╡
│ 1   ┆ [{"A",2}, {"B",1}] │
└─────┴────────────────────┘

希望按value字段对data列排序,预期结果:

out = pl.DataFrame([{"id": 1, "data": [{"key": "B", "value": 1}, {"key": "A", "value": 2}]}])

输出结构:

shape: (1, 2)
┌─────┬────────────────────┐
│ id  ┆ data               │
│ --- ┆ ---                │
│ i64 ┆ list[struct[2]]    │
╞═════╪════════════════════╡
│ 1   ┆ [{"B",1}, {"A",2}] │
└─────┴────────────────────┘

但直接使用.list.sort()会返回未修改的输入,且该方法不接受参数:

df.with_columns(pl.col("data").list.sort())

解决方案

pl.Expr.list.sort()是基于列表元素本身的默认规则排序,对于结构体来说,默认排序逻辑不是按value字段,所以无法直接满足需求。你可以使用**list.sort_by()**方法,传入提取结构体value字段的表达式作为排序键:

result = df.with_columns(
    pl.col("data").list.sort_by(pl.element().struct.field("value"))
)

print(result)

执行后输出:

shape: (1, 2)
┌─────┬────────────────────┐
│ id  ┆ data               │
│ --- ┆ ---                │
│ i64 ┆ list[struct[2]]    │
╞═════╪════════════════════╡
│ 1   ┆ [{"B",1}, {"A",2}] │
└─────┴────────────────────┘

如果需要降序排序,只需添加reverse=True参数:

result_desc = df.with_columns(
    pl.col("data").list.sort_by(pl.element().struct.field("value"), reverse=True)
)

内容的提问来源于stack exchange,提问作者David Waterworth

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 10:46:00