Anonymous
Как умножить каждый элемент списка на значение в другом столбце?
Сообщение
Anonymous » 18 янв 2025, 18:49
У меня есть фрейм данных с определенным количеством групп, содержащий столбец веса и список значений, который может иметь произвольную длину, например:
Код: Выделить всё
df = pl.DataFrame(
{
"Group": ["Group1", "Group2", "Group3"],
"Weight": [100.0, 200.0, 300.0],
"Vals": [[0.5, 0.5, 0.8],[0.5, 0.5, 0.8], [0.7, 0.9]]
}
)
Код: Выделить всё
┌────────┬────────┬─────────────────┐
│ Group ┆ Weight ┆ Vals │
│ --- ┆ --- ┆ --- │
│ str ┆ f64 ┆ list[f64] │
╞════════╪════════╪═════════════════╡
│ Group1 ┆ 100.0 ┆ [0.5, 0.5, 0.8] │
│ Group2 ┆ 200.0 ┆ [0.5, 0.5, 0.8] │
│ Group3 ┆ 300.0 ┆ [0.7, 0.9] │
└────────┴────────┴─────────────────┘
Моя цель — вычислить «взвешенный» столбец, который будет кратен каждому элементу в списке значений значению в столбце веса:
Код: Выделить всё
┌────────┬────────┬─────────────────┬─────────────────┐
│ Group ┆ Weight ┆ Vals ┆ Weighted │
│ --- ┆ --- ┆ --- ┆ --- │
│ str ┆ f64 ┆ list[f64] ┆ list[i64] │
╞════════╪════════╪═════════════════╪═════════════════╡
│ Group1 ┆ 100.0 ┆ [0.5, 0.5, 0.8] ┆ [50, 50, 80] │
│ Group2 ┆ 200.0 ┆ [0.5, 0.5, 0.8] ┆ [100, 100, 160] │
│ Group3 ┆ 300.0 ┆ [0.7, 0.9] ┆ [210, 270] │
└────────┴────────┴─────────────────┴─────────────────┘
Я пробовал несколько разных вещей:
Код: Выделить всё
df.with_columns(
pl.col("Vals").list.eval(pl.element() * 3).alias("Weight1"), #Multiplying with literal works
pl.col("Vals").list.eval(pl.element() * pl.col("Weight")).alias("Weight2"), #Does not work
pl.col("Vals").list.eval(pl.element() * pl.col("Unknown")).alias("Weight3"), #Unknown columns give same value
pl.col("Vals").list.eval(pl.col("Vals") * pl.col("Weight")).alias("Weight4"), #Same effect
# pl.col('Vals') * 3 -> gives an error
)
Код: Выделить всё
┌────────┬────────┬────────────┬────────────┬──────────────┬──────────────┬────────────────────┐
│ Group ┆ Weight ┆ Vals ┆ Weight1 ┆ Weight2 ┆ Weight3 ┆ Weight4 │
│ --- ┆ --- ┆ --- ┆ --- ┆ --- ┆ --- ┆ --- │
│ str ┆ f64 ┆ list[f64] ┆ list[f64] ┆ list[f64] ┆ list[f64] ┆ list[f64] │
╞════════╪════════╪════════════╪════════════╪══════════════╪══════════════╪════════════════════╡
│ Group1 ┆ 100.0 ┆ [0.5, 0.5, ┆ [1.5, 1.5, ┆ [0.25, 0.25, ┆ [0.25, 0.25, ┆ [0.25, 0.25, 0.64] │
│ ┆ ┆ 0.8] ┆ 2.4] ┆ 0.64] ┆ 0.64] ┆ │
│ Group2 ┆ 200.0 ┆ [0.5, 0.5, ┆ [1.5, 1.5, ┆ [0.25, 0.25, ┆ [0.25, 0.25, ┆ [0.25, 0.25, 0.64] │
│ ┆ ┆ 0.8] ┆ 2.4] ┆ 0.64] ┆ 0.64] ┆ │
│ Group3 ┆ 300.0 ┆ [0.7, 0.9] ┆ [2.1, 2.7] ┆ [0.49, 0.81] ┆ [0.49, 0.81] ┆ [0.49, 0.81] │
└────────┴────────┴────────────┴────────────┴──────────────┴──────────────┴────────────────────┘
Если я не правильно понимаю, похоже, что вы не можете получить доступ к столбцам за пределами списка из функции eval. Возможно, существует способ использовать понимание списка внутри оператора, но это не совсем удачное решение.
Каков здесь рекомендуемый подход? Любая помощь будет оценена по достоинству!
Подробнее здесь:
https://stackoverflow.com/questions/743 ... ent-column
1737215359
Anonymous
У меня есть фрейм данных с определенным количеством групп, содержащий столбец веса и список значений, который может иметь произвольную длину, например: [code]df = pl.DataFrame( { "Group": ["Group1", "Group2", "Group3"], "Weight": [100.0, 200.0, 300.0], "Vals": [[0.5, 0.5, 0.8],[0.5, 0.5, 0.8], [0.7, 0.9]] } ) [/code] [code]┌────────┬────────┬─────────────────┐ │ Group ┆ Weight ┆ Vals │ │ --- ┆ --- ┆ --- │ │ str ┆ f64 ┆ list[f64] │ ╞════════╪════════╪═════════════════╡ │ Group1 ┆ 100.0 ┆ [0.5, 0.5, 0.8] │ │ Group2 ┆ 200.0 ┆ [0.5, 0.5, 0.8] │ │ Group3 ┆ 300.0 ┆ [0.7, 0.9] │ └────────┴────────┴─────────────────┘ [/code] Моя цель — вычислить «взвешенный» столбец, который будет кратен каждому элементу в списке значений значению в столбце веса: [code]┌────────┬────────┬─────────────────┬─────────────────┐ │ Group ┆ Weight ┆ Vals ┆ Weighted │ │ --- ┆ --- ┆ --- ┆ --- │ │ str ┆ f64 ┆ list[f64] ┆ list[i64] │ ╞════════╪════════╪═════════════════╪═════════════════╡ │ Group1 ┆ 100.0 ┆ [0.5, 0.5, 0.8] ┆ [50, 50, 80] │ │ Group2 ┆ 200.0 ┆ [0.5, 0.5, 0.8] ┆ [100, 100, 160] │ │ Group3 ┆ 300.0 ┆ [0.7, 0.9] ┆ [210, 270] │ └────────┴────────┴─────────────────┴─────────────────┘ [/code] Я пробовал несколько разных вещей: [code]df.with_columns( pl.col("Vals").list.eval(pl.element() * 3).alias("Weight1"), #Multiplying with literal works pl.col("Vals").list.eval(pl.element() * pl.col("Weight")).alias("Weight2"), #Does not work pl.col("Vals").list.eval(pl.element() * pl.col("Unknown")).alias("Weight3"), #Unknown columns give same value pl.col("Vals").list.eval(pl.col("Vals") * pl.col("Weight")).alias("Weight4"), #Same effect # pl.col('Vals') * 3 -> gives an error ) [/code] [code]┌────────┬────────┬────────────┬────────────┬──────────────┬──────────────┬────────────────────┐ │ Group ┆ Weight ┆ Vals ┆ Weight1 ┆ Weight2 ┆ Weight3 ┆ Weight4 │ │ --- ┆ --- ┆ --- ┆ --- ┆ --- ┆ --- ┆ --- │ │ str ┆ f64 ┆ list[f64] ┆ list[f64] ┆ list[f64] ┆ list[f64] ┆ list[f64] │ ╞════════╪════════╪════════════╪════════════╪══════════════╪══════════════╪════════════════════╡ │ Group1 ┆ 100.0 ┆ [0.5, 0.5, ┆ [1.5, 1.5, ┆ [0.25, 0.25, ┆ [0.25, 0.25, ┆ [0.25, 0.25, 0.64] │ │ ┆ ┆ 0.8] ┆ 2.4] ┆ 0.64] ┆ 0.64] ┆ │ │ Group2 ┆ 200.0 ┆ [0.5, 0.5, ┆ [1.5, 1.5, ┆ [0.25, 0.25, ┆ [0.25, 0.25, ┆ [0.25, 0.25, 0.64] │ │ ┆ ┆ 0.8] ┆ 2.4] ┆ 0.64] ┆ 0.64] ┆ │ │ Group3 ┆ 300.0 ┆ [0.7, 0.9] ┆ [2.1, 2.7] ┆ [0.49, 0.81] ┆ [0.49, 0.81] ┆ [0.49, 0.81] │ └────────┴────────┴────────────┴────────────┴──────────────┴──────────────┴────────────────────┘ [/code] Если я не правильно понимаю, похоже, что вы не можете получить доступ к столбцам за пределами списка из функции eval. Возможно, существует способ использовать понимание списка внутри оператора, но это не совсем удачное решение. Каков здесь рекомендуемый подход? Любая помощь будет оценена по достоинству! Подробнее здесь: [url]https://stackoverflow.com/questions/74372173/how-to-multiply-each-element-in-a-list-with-a-value-in-a-different-column[/url]