Как повторять и усекать элементы списка Polars до фиксированной длиныPython

Программы на Python
Ответить
Anonymous
 Как повторять и усекать элементы списка Polars до фиксированной длины

Сообщение Anonymous »

У меня есть данные следующего вида:
import polars as pl

lf = pl.LazyFrame(
{
"points": [
[
[1.0, 2.0],
],
[
[3.0, 4.0],
[5.0, 6.0],
],
[
[7.0, 8.0],
[9.0, 10.0],
[11.0, 12.0],
],
],
"other": ["foo", "bar", "baz"],
},
schema={
"points": pl.List(pl.Array(pl.Float32, 2)),
"other": pl.String,
},
)

И я хочу, чтобы все списки содержали одинаковое количество элементов.
Если в данный момент в нем больше, чем мне нужно, он должен быть усечен.
Если в нем меньше, чем мне нужно, он должен повторяться по порядку, пока не будет достаточно.
Мне удалось заставить это работать, но я чувствую, что прыгаю через обручи. Есть ли более чистый способ сделать это? Может быть, со сбором?
target_length = 3

result = (
lf.with_columns(
needed=pl.lit(target_length).truediv(pl.col("points").list.len()).ceil()
)
.with_columns(
pl.col("points")
.repeat_by("needed")
.list.eval(pl.element().explode())
.list.head(target_length)
)
.drop("needed")
)

РЕДАКТИРОВАТЬ
Приведенный выше метод работает для игрушечных примеров, но когда я пытаюсь использовать его в своем реальном наборе данных, он терпит неудачу:
pyo3_runtime.PanicException: Polars' maximum length reached. Consider installing 'polars-u64-idx'.

Мне не удалось создать MRE для этого, но мои данные содержат 4 миллиона строк, а список «точек» в каждой строке содержит от 1 до 8000 элементов (и я пытаюсь дополнить/обрезать до 800 элементов). Все они кажутся довольно маленькими, я не понимаю, как достигается максимальная длина u32.
Я ценю любые альтернативные подходы, которые могу попробовать.
Самый близкий вариант (который не вызывает паники):
Но это не позволяет повторять список по порядку. Он просто дополняет повторение последнего элемента.
target_length = 3

result = (
lf.with_columns(
pl.col("points")
.list.gather(
pl.int_range(target_length),
null_on_oob=True,
)
.list.eval(pl.element().forward_fill())
)
.drop("needed")
)


Подробнее здесь: https://stackoverflow.com/questions/795 ... xed-length
Ответить

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

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

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

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

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