在整个 table 的组内排序

Sort within groups on entire table

如果我只有一列,我可以使用 over 方法在组内对该列进行排序。例如,

import polars as pl

df = pl.DataFrame({'group': [2,2,1,1,2,2], 'value': [3,4,3,1,1,3]})
 
df.with_column(pl.col('value').sort().over('group'))
# shape: (6, 2)
# ┌───────┬───────┐
# │ group ┆ value │
# │ ---   ┆ ---   │
# │ i64   ┆ i64   │
# ╞═══════╪═══════╡
# │ 2     ┆ 1     │
# ├╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌┤
# │ 2     ┆ 3     │
# ├╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌┤
# │ 1     ┆ 1     │
# ├╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌┤
# │ 1     ┆ 3     │
# ├╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌┤
# │ 2     ┆ 3     │
# ├╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌┤
# │ 2     ┆ 4     │
# └───────┴───────┘

操作的好处在于它保持了组的顺序(例如,group=1 仍然是第 3 和 4 行;group=2 仍然是第 1、2、5 和 6 行)。

但这只适用于对单个列进行排序。如何像这样对整个 table 进行排序?我在下面尝试了这些方法,但其中 none 有效:

import polars as pl

df = pl.DataFrame({'group': [2,2,1,1,2,2], 'value': [3,4,3,1,1,3], 'value2': [5,4,3,2,1,0]})

df.groupby('group').sort(['value', 'value2'])
# errors

df.sort([pl.col('value').over('group'), pl.col('value2').over('group')])
# does not sort with groups

# Looking for this:
# shape: (6, 3)
# ┌───────┬───────┬────────┐
# │ group ┆ value ┆ value2 │
# │ ---   ┆ ---   ┆ ---    │
# │ i64   ┆ i64   ┆ i64    │
# ╞═══════╪═══════╪════════╡
# │ 2     ┆ 1     ┆ 1      │
# ├╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌┤
# │ 2     ┆ 3     ┆ 0      │
# ├╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌┤
# │ 1     ┆ 1     ┆ 2      │
# ├╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌┤
# │ 1     ┆ 3     ┆ 3      │
# ├╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌┤
# │ 2     ┆ 3     ┆ 5      │
# ├╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌┤
# │ 2     ┆ 4     ┆ 4      │
# └───────┴───────┴────────┘

在分组情况下对整个 table 进行排序的解决方案是 pl.all().sort_by(sort_columns).over(group_columns)

import polars as pl

df = pl.DataFrame({
  'group': [2,2,1,1,2,2],
  'value': [3,4,3,1,1,3],
  'value2': [5,4,3,2,1,0],
})

df.select(pl.all().sort_by(['value','value2']).over('group'))
df.select(
    pl.all().sort_by(['value','value2']).over('group').sort_by(['group'])
)

可能会有帮助。