Учитывая этот DataFrame.
import polars as pl
df = pl.DataFrame(
{'id':['1']*3 + ['2']*3,
'actions': [0,1,2, 0, 1, 2],
'campaign_name': [None,None, '2', '1', '2', None] ,
'event_time': [1,2,3,0,1,2],
'session_id':['session_1']*6}
)
┌─────┬─────────┬───────────────┬────────────┬────────────┐
│ id ┆ actions ┆ campaign_name ┆ event_time ┆ session_id │
│ --- ┆ --- ┆ --- ┆ --- ┆ --- │
│ str ┆ i64 ┆ str ┆ i64 ┆ str │
╞═════╪═════════╪═══════════════╪════════════╪════════════╡
│ 1 ┆ 0 ┆ null ┆ 1 ┆ session_1 │
│ 1 ┆ 1 ┆ null ┆ 2 ┆ session_1 │
│ 1 ┆ 2 ┆ 2 ┆ 3 ┆ session_1 │
│ 2 ┆ 0 ┆ 1 ┆ 0 ┆ session_1 │
│ 2 ┆ 1 ┆ 2 ┆ 1 ┆ session_1 │
│ 2 ┆ 2 ┆ null ┆ 2 ┆ session_1 │
└─────┴─────────┴───────────────┴────────────┴────────────┘
Я хочу получить минимальное\максимальное время_события по комбинации группы session_id и id при условии имя_кампании.
Вот мой код.
df.with_columns(
pl.when(pl.col('campaign_name').is_in(['1','2']))
.then(
pl.col('actions').min().over('session_id', 'id').alias('min_action')
),
pl.when(pl.col('campaign_name').is_in(['1','2']))
.then(
pl.col('actions').max().over('session_id', 'id').alias('max_action')
)
)
Но результаты не такие, как ожидалось.
shape: (6, 7)
┌─────┬─────────┬───────────────┬────────────┬────────────┬────────────┬────────────┐
│ id ┆ actions ┆ campaign_name ┆ event_time ┆ session_id ┆ min_action ┆ max_action │
│ --- ┆ --- ┆ --- ┆ --- ┆ --- ┆ --- ┆ --- │
│ str ┆ i64 ┆ str ┆ i64 ┆ str ┆ i64 ┆ i64 │
╞═════╪═════════╪═══════════════╪════════════╪════════════╪════════════╪════════════╡
│ 1 ┆ 0 ┆ null ┆ 1 ┆ session_1 ┆ null ┆ null │
│ 1 ┆ 1 ┆ null ┆ 2 ┆ session_1 ┆ null ┆ null │
│ 1 ┆ 2 ┆ 2 ┆ 3 ┆ session_1 ┆ 0 ┆ 2 │
│ 2 ┆ 0 ┆ 1 ┆ 0 ┆ session_1 ┆ 0 ┆ 2 │
│ 2 ┆ 1 ┆ 2 ┆ 1 ┆ session_1 ┆ 0 ┆ 2 │
│ 2 ┆ 2 ┆ null ┆ 2 ┆ session_1 ┆ null ┆ null │
└─────┴─────────┴───────────────┴────────────┴────────────┴────────────┴────────────┘
Код работает в противоположном направлении.
Код вычисляет мин/макс для всех значений, а не для значений, отфильтрованных по условию.
Ожидаемые результаты:
shape: (6, 7)
┌─────┬─────────┬───────────────┬────────────┬────────────┬────────────┬────────────┐
│ id ┆ actions ┆ campaign_name ┆ event_time ┆ session_id ┆ min_action ┆ max_action │
│ --- ┆ --- ┆ --- ┆ --- ┆ --- ┆ --- ┆ --- │
│ str ┆ i64 ┆ str ┆ i64 ┆ str ┆ i64 ┆ i64 │
╞═════╪═════════╪═══════════════╪════════════╪════════════╪════════════╪════════════╡
│ 1 ┆ 0 ┆ null ┆ 1 ┆ session_1 ┆ 2 ┆ 2 │
│ 1 ┆ 1 ┆ null ┆ 2 ┆ session_1 ┆ 2 ┆ 2 │
│ 1 ┆ 2 ┆ 2 ┆ 3 ┆ session_1 ┆ 2 ┆ 2 │
│ 2 ┆ 0 ┆ 1 ┆ 0 ┆ session_1 ┆ 0 ┆ 1 │
│ 2 ┆ 1 ┆ 2 ┆ 1 ┆ session_1 ┆ 0 ┆ 1 │
│ 2 ┆ 2 ┆ null ┆ 2 ┆ session_1 ┆ 0 ┆ 1 │
└─────┴─────────┴───────────────┴────────────┴────────────┴────────────┴────────────┘
Подробнее здесь: https://stackoverflow.com/questions/773 ... -condition