我有一个具有一定数量组的数据框,包含一个权重列和一个值列表,可以是任意长度,例如:
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").arr.eval(pl.element() * 3).alias("Weight1"), #Multiplying with literal works
pl.col("Vals").arr.eval(pl.element() * pl.col("Weight")).alias("Weight2"), #Does not work
pl.col("Vals").arr.eval(pl.element() * pl.col("Unknown")).alias("Weight3"), #Unknown columns give same value
pl.col("Vals").arr.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 函数内访问列表之外的列。也许有一种方法可以在语句中使用列表理解,但这看起来并不是一个很好的解决方案。
这里推荐的方法是什么?任何帮助将不胜感激!
最佳答案
编辑 - Polars 更新:
从最新版本的 Polars 开始,这是正确的语法:
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]]
}
)
(df
.explode('Vals')
.with_columns(Weighted = pl.col('Weight')*pl.col('Vals'))
.groupby('Group')
.agg(
pl.col('Weight').first(),
pl.col('Vals'),
pl.col('Weighted')
)
)
旧答案:
(df
.explode('Vals')
.with_columns(Weighted = pl.col('Weight')*pl.col('Vals'))
.groupby('Group')
.agg([
pl.col('Weight').first(),
pl.col('Vals').list(),
pl.col('Weighted').list()
])
)
关于Python-极性:如何将列表中的每个元素与不同列中的值相乘?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74372173/