对具有多个类别列的 Polars 数据框进行排序

问题描述 投票:0回答:2

我想对具有两个类别列的极坐标数据框进行多列排序,但没有得到预期的结果。最终排序的数据框应该按第一列排序,然后对第二列排序,最后对第三列排序。

前两列是分类列,具有我想要维护的类别顺序(即物理顺序)。当我运行下面的代码时,我希望排序的数据帧的前两列具有相同的顺序,而第三列的值顺序将被切换。

我不确定我错过了什么,希望有人可以帮助我。

这是代码:

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))
        .with_columns(pl.col("res").cast(pl.Categorical))
    )

    df1 = df.sort(df.columns)

print(df)
print(df1)

下面的输出显示,在排序的数据框中,第二个类别列未按物理顺序排序。

我在配备 M1 Pro 芯片的 Mac Book Pro 上使用带有 python 3.10.8 的 Polars 版本 0.15.14。

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   ┆ hr  ┆ 1.1 │
│ ss   ┆ hr  ┆ 2.1 │
│ ss   ┆ lr  ┆ 1.1 │
│ ss   ┆ lr  ┆ 2.1 │
│ ff   ┆ hr  ┆ 1.1 │
│ ff   ┆ hr  ┆ 2.1 │
│ ff   ┆ lr  ┆ 1.1 │
│ ff   ┆ lr  ┆ 2.1 │
└──────┴─────┴─────┘
dataframe sorting python-polars
2个回答
1
投票

CatNameSpace
中,分类
set_ordering
默认为
"physical"
。 您可以像这样将其更改为
"lexical"

with pl.StringCache():

    df = (
        df
        .with_columns(
            [
                pl.col("proc").cast(pl.Categorical).cat.set_ordering("lexical"),
                pl.col("res").cast(pl.Categorical).cat.set_ordering("lexical")
            ]
        )
    )

    df1 = df.sort(df.columns)

然后

print(df1)
输出:

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

0
投票

正如所指出的,这个排序问题是一个错误。请参阅https://github.com/pola-rs/polars/issues/7343。最新的 Polars 版本 0.16.12 修复了这个问题。

© www.soinside.com 2019 - 2024. All rights reserved.