请考虑以下情况pl.DataFrame
:
import polars as pl
df = pl.DataFrame(
{
"symbol": ["s1", "s1", "s2", "s2"],
"signal": [0, 1, 2, 0],
"trade": [None, 1, None, -1],
}
)
shape: (4, 3)
┌────────┬────────┬───────┐
│ symbol ┆ signal ┆ trade │
│ --- ┆ --- ┆ --- │
│ str ┆ i64 ┆ i64 │
╞════════╪════════╪═══════╡
│ s1 ┆ 0 ┆ null │
│ s1 ┆ 1 ┆ 1 │
│ s2 ┆ 2 ┆ null │
│ s2 ┆ 0 ┆ -1 │
└────────┴────────┴───────┘
现在,我需要对数据框进行分组,symbol
并检查列中每个组的第一行signal
是否不等于 0(零)。如果等于True
,我需要用trade
单元格中的值替换列中相应的单元格signal
。
这是我真正在寻找的:
shape: (4, 3)
┌────────┬────────┬───────┐
│ symbol ┆ signal ┆ trade │
│ --- ┆ --- ┆ --- │
│ str ┆ i64 ┆ i64 │
╞════════╪════════╪═══════╡
│ s1 ┆ 0 ┆ null │
│ s1 ┆ 1 ┆ 1 │
│ s2 ┆ 2 ┆ 2 │ <- copy value from the ``signal`` column
│ s2 ┆ 0 ┆ -1 │
└────────┴────────┴───────┘
为此,可以使用when-then-otherwise结构。
True
第一行(使用动态创建索引pl.int_range
)进行精确计算。signal
signal
或trade
列中的值。您可以使用
.is_first_distinct()
来识别所需的行。并将其用作 when/then 逻辑的一部分:
使用符号和:
cum_count
over
when
输出: