Прикрепление «ингруппового индекса» к каждой строке отсортированных данных с помощью PolarsPython

Программы на Python
Ответить
Anonymous
 Прикрепление «ингруппового индекса» к каждой строке отсортированных данных с помощью Polars

Сообщение Anonymous »

Вот решение, которое я придумал для этой проблемы:

Код: Выделить всё

import polars as pl
import numpy as np

max_groups = 5
max_reps = 3

# print out all rows in our table, for the sake of convenience
pl.Config.set_tbl_rows(max_groups * max_reps)

num_groups = np.random.randint(3, max_groups + 1)
unique_ids = np.random.randint(97, 123, num_groups)
repetitions = np.random.randint(1, max_reps + 1, num_groups)

id_col = "id"
data_col = "point"
index_col = "ixs"

# # Generate data
# convert integers to ascii using `chr`
ids = pl.Series(
id_col,
[c for n, id in zip(repetitions, unique_ids) for c in [chr(id)] * n],
)
data = pl.Series(
data_col,
np.random.rand(len(ids)),
)
df = pl.DataFrame([ids, data])

# # Generate indices
df.sort(id_col, data_col).group_by(id_col).agg(
pl.col(data_col), pl.int_range(pl.len()).alias(index_col)
).explode(data_col, index_col).sort(id_col, data_col)

Код: Выделить всё

shape: (7, 3)
┌─────┬──────────┬─────┐
│ id  ┆ point    ┆ ixs │
│ --- ┆ ---      ┆ --- │
│ str ┆ f64      ┆ i64 │
╞═════╪══════════╪═════╡
│ g   ┆ 0.030686 ┆ 0   │
│ g   ┆ 0.322024 ┆ 1   │
│ k   ┆ 0.124792 ┆ 0   │
│ k   ┆ 0.289025 ┆ 1   │
│ s   ┆ 0.485742 ┆ 0   │
│ s   ┆ 0.689397 ┆ 1   │
│ u   ┆ 0.516705 ┆ 0   │
└─────┴──────────┴─────┘
Могу ли я добиться большего? Например, я сортирую дважды: один раз перед группировкой и один раз после. Я могу устранить необходимость во второй сортировке, выбрав continue_order=True в group_by:

Код: Выделить всё

# # Generate indices, but maintain_order in group_by
df.sort(id_col, data_col).group_by(id_col, maintain_order=True).agg(
pl.col(data_col), pl.int_range(pl.len()).alias(index_col)
).explode(data_col, index_col)
(Некоторые простые и очень наивные эксперименты, основанные на timeit, предполагают, что метод continue_order=True обычно выигрывает у двойной сортировки, но не с большим отрывом.)


Подробнее здесь: https://stackoverflow.com/questions/787 ... ith-polars
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»