将极坐标数据框中列表列的元素与常规Python列表的元素相乘

问题描述 投票:0回答:1

我有一个

pl.DataFrame
,其中有一列包含这样的列表:

import polars as pl

df = pl.DataFrame(
    {
        "symbol": ["A", "A", "B", "B"],
        "roc": [[0.1, 0.2], [0.3, 0.4], [0.5, 0.6], [0.7, 0.8]],
    }
)

shape: (4, 2)
┌────────┬────────────┐
│ symbol ┆ roc        │
│ ---    ┆ ---        │
│ str    ┆ list[f64]  │
╞════════╪════════════╡
│ A      ┆ [0.1, 0.2] │
│ A      ┆ [0.3, 0.4] │
│ B      ┆ [0.5, 0.6] │
│ B      ┆ [0.7, 0.8] │
└────────┴────────────┘

此外,我有一个常规的Python列表

weights = [0.3, 0.7]

pl.col("roc")
weights
相乘的有效方法是什么,即列的第一个和第二个元素将分别与
weights
的第一个和第二个元素相乘?

预期输出是这样的:

shape: (4, 3)
┌────────┬────────────┐──────────────┐
│ symbol ┆ roc        │ roc_wgt      │
│ ---    ┆ ---        │ ---          │
│ str    ┆ list[f64]  │ list[f64]    │
╞════════╪════════════╡══════════════╡
│ A      ┆ [0.1, 0.2] │ [0.03, 0.14] │ = [0.1 * 0.3, 0.2 * 0.7]
│ A      ┆ [0.3, 0.4] │ [0.09, 0.28] │ = [0.3 * 0.3, 0.4 * 0.7]
│ B      ┆ [0.5, 0.6] │ [0.15, 0.42] │ = [0.5 * 0.3, 0.6 * 0.7]
│ B      ┆ [0.7, 0.8] │ [0.21, 0.56] │ = [0.7 * 0.3, 0.8 * 0.7]
└────────┴────────────┘──────────────┘
python python-polars
1个回答
0
投票

首次运行的一个选项

explode
:

(df.with_row_index().with_columns(l=weights).explode(['roc', 'l'])
   .with_columns(roc_wgt=pl.col('roc')*pl.col('l'))
   .group_by('index')
   .agg(pl.col('symbol').first(),
        pl.col('roc'),
        pl.col('roc_wgt'))
)

输出:

┌───────┬────────┬────────────┬──────────────┐
│ index ┆ symbol ┆ roc        ┆ roc_wgt      │
│ ---   ┆ ---    ┆ ---        ┆ ---          │
│ u32   ┆ str    ┆ list[f64]  ┆ list[f64]    │
╞═══════╪════════╪════════════╪══════════════╡
│ 0     ┆ A      ┆ [0.1, 0.2] ┆ [0.03, 0.14] │
│ 1     ┆ A      ┆ [0.3, 0.4] ┆ [0.09, 0.28] │
│ 2     ┆ B      ┆ [0.5, 0.6] ┆ [0.15, 0.42] │
│ 3     ┆ B      ┆ [0.7, 0.8] ┆ [0.21, 0.56] │
└───────┴────────┴────────────┴──────────────┘
© www.soinside.com 2019 - 2024. All rights reserved.