Polars DataFrame多分类列排序异常问题求助
问题排查:Polars分类列排序未遵循物理顺序
问题核心
你需要对包含两个分类列的Polars DataFrame按proc(物理顺序)→res(物理顺序)→vdd(降序)排序,但当前代码运行后,res列出现hr排在lr前的情况,不符合预期的物理顺序,同时vdd列也未实现反转排序。
问题原因
- 分类列默认排序规则:Polars中
Categorical类型默认按字典序(字符串字母顺序)排序,而非数据首次出现的物理顺序,因此hr会因字母顺序排在lr之前。 - 排序规则未显式指定:原代码
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
相关产品推荐
相关产品推荐

