Polars – Windows-Funktion mit BedingungPython

Python-Programme
Anonymous
 Polars – Windows-Funktion mit Bedingung

Post by Anonymous »

Angesichts dieses DataFrame.

Code: Select all

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}
)

Code: Select all

┌─────┬─────────┬───────────────┬────────────┬────────────┐
│ 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  │
└─────┴─────────┴───────────────┴────────────┴────────────┘
Ich möchte die minimale/maximale Ereigniszeit durch eine Kombinationsgruppe aus Sitzungs-ID und ID unter der Bedingung Kampagnenname erhalten.
Hier ist mein Code.

Code: Select all

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')
)
)
Aber die Ergebnisse sind nicht wie erwartet.

Code: Select all

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       │
└─────┴─────────┴───────────────┴────────────┴────────────┴────────────┴────────────┘
Der Code funktioniert in die entgegengesetzte Richtung.
Der Code berechnet die Min/Max-Werte für alle Werte und nicht für die durch die Bedingung gefilterten Werte.
Erwartete Ergebnisse:

Code: Select all

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          │
└─────┴─────────┴───────────────┴────────────┴────────────┴────────────┴────────────┘

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post