让我们有一个极坐标 df:
df = pl.DataFrame(
{
'date': ['2022-01-01', '2022-01-02', '2022-01-07', '2022-01-17', '2022-03-02', '2022-06-05', '2022-06-07', '2022-07-02'],
'col1': [4, 4, 2, 2, 2, 3, 2, 1],
'col2': [1, 2, 3, 4, 1, 3, 3, 4],
'col3': [2, 3, 4, 4, 3, 2, 2, 1]
}
)
日期 | 第 1 列 | 列2 | 第 3 列 |
---|---|---|---|
2022-01-01 | 1 | 1 | 2 |
2022-01-02 | 1 | 2 | 3 |
2022-01-07 | 2 | 3 | 4 |
2022-01-17 | 2 | 4 | 1 |
2022-03-02 | 3 | 1 | 3 |
2022-06-05 | 3 | 2 | 2 |
2022-06-07 | 4 | 3 | 4 |
2022-07-02 | 4 | 4 | 1 |
df 按日期排序。我想创建一个列,它可以提供所有较早行(较低日期)的计数,其中所有 3 列的值都大于或等于当前行中的值。或者换句话说:
Count rows
where row_index < current_row_index &
col1[row_index] >= col1[current_row_index] &
col2[row_index] >= col2[current_row_index] &
col3[row_index] >= col3[current_row_index]
)
结果应该是这样的:
日期 | 第 1 列 | 列2 | 第 3 列 | 葛 |
---|---|---|---|---|
2022-01-01 | 4 | 1 | 2 | 0 |
2022-01-02 | 4 | 2 | 3 | 0 |
2022-01-07 | 2 | 3 | 4 | 0 |
2022-01-17 | 2 | 4 | 4 | 0 |
2022-03-02 | 2 | 1 | 3 | 3 |
2022-06-05 | 3 | 3 | 2 | 0 |
2022-06-07 | 2 | 3 | 2 | 3 |
2022-07-02 | 1 | 4 | 1 | 1 |
我尝试过shift
、qe
、over
、when
等的各种组合cum_count
,但我一直无法弄清楚。我也找不到足够相似的问题来成功采用其答案。有没有办法使用 Polar 来实现这一目标?先感谢您。
本质上,这个想法是将您需要的所有信息收集
cumulative_eval
到列表中,然后将结果列表分解为行,并仅考虑所有列表值都为 true 的行:duckdb
由于与 Polars 的无缝集成,您也可以这样做:您还可以使用结构体将所有条件逻辑放入其中
.cumulative_eval()