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

Polars DataFrame多分类列排序异常问题求助

问题排查:Polars分类列排序未遵循物理顺序

问题核心

你需要对包含两个分类列的Polars DataFrame按proc(物理顺序)→res(物理顺序)→vdd(降序)排序,但当前代码运行后,res列出现hr排在lr前的情况,不符合预期的物理顺序,同时vdd列也未实现反转排序。

问题原因

  1. 分类列默认排序规则:Polars中Categorical类型默认按字典序(字符串字母顺序)排序,而非数据首次出现的物理顺序,因此hr会因字母顺序排在lr之前。
  2. 排序规则未显式指定:原代码df.sort(df.columns)仅按所有列默认升序排序,既没有指定分类列的物理排序规则,也未设置vdd列的降序要求。

修正代码

import polars as pl

df = pl.DataFrame(
    [
        ["ss", "lr", 2.1],
        ["ss", "lr", 1.1],
        ["ss", "hr", 2.1],
        ["ss", "hr", 1.1],
        ["ff", "lr", 2.1],
        ["ff", "lr", 1.1],
        ["ff", "hr", 2.1],
        ["ff", "hr", 1.1],
    ],
    schema=["proc", "res", "vdd"],
    orient="row",
)

with pl.StringCache():
    # 转换分类列时指定物理排序规则
    df = df.with_columns(
        pl.col("proc").cast(pl.Categorical(ordering="physical")),
        pl.col("res").cast(pl.Categorical(ordering="physical"))
    )

    # 显式定义排序规则:按物理顺序排前两列,第三列降序
    df1 = df.sort(
        [
            pl.col("proc").sort_by("physical"),
            pl.col("res").sort_by("physical"),
            pl.col("vdd").reverse()
        ]
    )

print(df)
print(df1)

修正后预期输出

shape: (8, 3)
┌──────┬─────┬─────┐
│ proc ┆ res ┆ vdd │
│ ---  ┆ --- ┆ --- │
│ cat  ┆ cat ┆ f64 │
╞══════╪═════╪═════╡
│ ss   ┆ lr  ┆ 2.1 │
│ ss   ┆ lr  ┆ 1.1 │
│ ss   ┆ hr  ┆ 2.1 │
│ ss   ┆ hr  ┆ 1.1 │
│ ff   ┆ lr  ┆ 2.1 │
│ ff   ┆ lr  ┆ 1.1 │
│ ff   ┆ hr  ┆ 2.1 │
│ ff   ┆ hr  ┆ 1.1 │
└──────┴─────┴─────┘
shape: (8, 3)
┌──────┬─────┬─────┐
│ proc ┆ res ┆ vdd │
│ ---  ┆ --- ┆ --- │
│ cat  ┆ cat ┆ f64 │
╞══════╪═════╪═════╡
│ ss   ┆ lr  ┆ 2.1 │
│ ss   ┆ lr  ┆ 1.1 │
│ ss   ┆ hr  ┆ 2.1 │
│ ss   ┆ hr  ┆ 1.1 │
│ ff   ┆ lr  ┆ 2.1 │
│ ff   ┆ lr  ┆ 1.1 │
│ ff   ┆ hr  ┆ 2.1 │
│ ff   ┆ hr  ┆ 1.1 │
└──────┴─────┴─────┘

关键说明

  • ordering="physical":在转换分类列时,指定以数据首次出现的顺序作为分类的排序基准。
  • .sort_by("physical"):排序时显式指定分类列使用物理顺序,覆盖默认的字典序规则。
  • .reverse():对vdd列实现降序排序,满足你第三列值反转的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 05:25:42