Как я могу сопоставить поле структуры поляров со значениями другого поля «a» со значениями другого поля «b»?Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Как я могу сопоставить поле структуры поляров со значениями другого поля «a» со значениями другого поля «b»?

Сообщение Anonymous »

У меня есть фрейм данных Polars с этими столбцами. Я хочу заменить значения в каждом списке в столбце C соответствующим значением в столбце b в зависимости от позиции, которую значение в столбце c занимает в столбце a.

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

┌────────────────────┬─────────────────────────────────┬────────────────────┐
│ a                  ┆ b                               ┆ c                  │
│ ---                ┆ ---                             ┆ ---                │
│ list[f32]          ┆ list[f64]                       ┆ list[f32]          │
╞════════════════════╪═════════════════════════════════╪════════════════════╡
│ [1.0, 0.0]         ┆ [0.001143, 0.998857]            ┆ [0.0, 0.5, … 1.5]  │
│ [5.0, 6.0, … 4.0]  ┆ [0.000286, 0.000143, … 0.00357… ┆ [0.0, 0.5, … 6.5]  │
│ [1.0, 0.0]         ┆ [0.005287, 0.994713]            ┆ [0.0, 0.5, … 1.5]  │
│ [0.0, 1.5, … 2.5]  ┆ [0.84367, 0.003858, … 0.000429… ┆ [0.0, 0.5, … 3.5]  │
│ [5.0, 6.0, … 1.0]  ┆ [0.001286, 0.000286, … 0.35267… ┆ [0.0, 0.5, … 6.5]  │
│ …                  ┆ …                               ┆ …                  │
│ [0.0, 1.0]         ┆ [0.990283, 0.009717]            ┆ [0.0, 0.5, … 1.5]  │
│ [5.0, 1.0, … 0.0]  ┆ [0.003001, 0.352672, … 0.42855… ┆ [0.0, 0.5, … 6.5]  │
│ [0.0, 2.0, … 3.0]  ┆ [0.90383, 0.004716, … 0.000143… ┆ [0.0, 0.5, … 3.5]  │
│ [2.0, 0.0, … 9.0]  ┆ [0.233352, 0.060446, … 0.00228… ┆ [0.0, 0.5, … 10.5] │
│ [5.0, 8.0, … 11.0] ┆ [0.134467, 0.022578, … 0.00085… ┆ [0.0, 0.5, … 12.5] │
└────────────────────┴─────────────────────────────────┴────────────────────┘
Вот моя попытка:

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

df = df.with_columns(
pl.struct("a", "b", "c").alias("d").struct.with_fields(
pl.field("c").replace(old=pl.field("a"), new=pl.field("b"), default=0)
)
)
К сожалению, это приводит к ошибке *** Polars.Exceptions.InvalidOperationError: `старый` ввод для `replace` не должен содержать дубликатов. Однако поле «a», передаваемое в старый аргумент, представляет собой столбец «a», который представляет собой уникальные значения из Expr.value_counts(), поэтому оно не должно содержать дубликатов. И действительно, df.select(pl.col("lines").list.eval(pl.element().is_duulated().any()).explode().any()) возвращает false.
Небольшой фрагмент данных для воспроизведения:

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

df = pl.DataFrame([
pl.Series('a', [[1.0, 0.0], [5.0, 6.0, 1.0, 0.0, 3.0, 2.0, 4.0], [1.0, 0.0], [0.0, 1.5, 3.0, 1.0, 2.0, 0.5, 2.5], [5.0, 6.0, 0.0, 3.0, 2.0, 4.0, 1.0]]),
pl.Series('b', [[0.0011431837667905116, 0.9988568162332095], [0.0002857959416976279, 0.00014289797084881395, 0.2842240640182909, 0.5985995998856817, 0.019291226064589884, 0.09388396684767077, 0.003572449271220349], [0.005287224921406116, 0.9947127750785939], [0.8436696198913975, 0.0038582452129179764, 0.00014289797084881395, 0.10703058016576164, 0.007859388396684767, 0.03701057444984281, 0.00042869391254644185], [0.0012860817376393256, 0.0002857959416976279, 0.4645613032294941, 0.038153758216633325, 0.13561017433552444, 0.007430694484138326, 0.3526721920548728]]),
pl.Series('c', [[0.0, 0.5, 1.0, 1.5], [0.0, 0.5, 1.0, 1.5, 2.0, 2.5, 3.0, 3.5, 4.0, 4.5, 5.0, 5.5, 6.0, 6.5], [0.0, 0.5, 1.0, 1.5], [0.0, 0.5, 0.5, 1.0, 1.0, 1.5, 1.5, 2.0, 2.0, 2.5, 2.5, 3.0, 3.0, 3.5], [0.0, 0.5, 1.0, 1.5, 2.0, 2.5, 3.0, 3.5, 4.0, 4.5, 5.0, 5.5, 6.0, 6.5]]),
])
Пример того, каким должен быть вывод:
Для первой строки новое поле столбца/структуры должно выглядеть так: [0.998857, 0, ..., 0]
code>, поскольку значения "c" равны [0,0, 0,5, ... 1,5] и 0 находится в индексе 1 в столбце "a", а значение в индексе 1 в столбце " б" равно 0,998857. Остальные значения 0,5 и 1,5 будут равны 0 по умолчанию, поскольку они не отображаются в «a».
Разве это просто невозможно? Я очень надеюсь найти векторизованный способ сделать это.
Любая помощь приветствуется, спасибо.

Подробнее здесь: https://stackoverflow.com/questions/789 ... ld-a-to-va
Реклама
Ответить Пред. темаСлед. тема

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

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

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

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

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

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