У меня есть данные следующего вида:
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
Как повторять и усекать элементы списка Polars до фиксированной длины ⇐ Python
Программы на Python
1761949526
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")
)
[b]РЕДАКТИРОВАТЬ[/b]
Приведенный выше метод работает для игрушечных примеров, но когда я пытаюсь использовать его в своем реальном наборе данных, он терпит неудачу:
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")
)
Подробнее здесь: [url]https://stackoverflow.com/questions/79556592/how-to-repeat-and-truncate-polars-list-elements-to-a-fixed-length[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия