如何使用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
相关产品推荐
相关产品推荐

