我想对具有两个类别列的极坐标数据框进行多列排序,但没有得到预期的结果。最终排序的数据框应该按第一列排序,然后对第二列排序,最后对第三列排序。
前两列是分类列,具有我想要维护的类别顺序(即物理顺序)。当我运行下面的代码时,我希望排序的数据帧的前两列具有相同的顺序,而第三列的值顺序将被切换。
我不确定我错过了什么,希望有人可以帮助我。
这是代码:
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 │
└──────┴─────┴─────┘
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 │
└──────┴─────┴─────┘
正如所指出的,这个排序问题是一个错误。请参阅https://github.com/pola-rs/polars/issues/7343。最新的 Polars 版本 0.16.12 修复了这个问题。